Kivy MDLabel 在 RecycleView 中更新数据后丢失文本

huangapple go评论165阅读模式
英文:

Kivy MDLabel in RecycleView losing text after updating data

问题

I'm having two screens, loginScreen and mainScreen. In the mainScreen I have a RecycleView of MDLabels. Initially when entering on mainScreen everything works fine, but whenever I'm refreshing the data of my RecycleView, the text of some labels keeps disappearing and appearing on scrolling.
When I use regular kivy labels instead of MDLabels, I'm not getting this strange behavior. Am I doing something wrong in the code or is this expected when using MDLabels in RecycleView?

main.py

  1. from kivymd.app import MDApp
  2. from kivy.lang import Builder
  3. from kivy.uix.screenmanager import ScreenManager
  4. from kivy.uix.screenmanager import Screen
  5. from kivymd.color_definitions import colors
  6. from kivymd.uix.boxlayout import MDBoxLayout
  7. import random
  8. class DailyService(MDBoxLayout):
  9. pass
  10. class MainScreen(Screen):
  11. def __init__(self, **kwargs):
  12. super(MainScreen, self).__init__(**kwargs)
  13. def switchButton(self):
  14. self.manager.switchToLoginScreen()
  15. class LoginScreen(Screen):
  16. def __init__(self, **kwargs):
  17. super(LoginScreen, self).__init__(**kwargs)
  18. def switchButton(self):
  19. self.manager.switchToMainScreen()
  20. class MyScreenManager(ScreenManager):
  21. def __init__(self, **kwargs):
  22. super(MyScreenManager, self).__init__(**kwargs)
  23. def switchToMainScreen(self):
  24. data = []
  25. for i in range(20):
  26. k = random.randint(0, 9)
  27. if k%2 == 0:
  28. color = colors['BlueGray']['700']
  29. else:
  30. color = colors['Green']['700']
  31. data.append({'day': 'DAY',
  32. 'service': 'SERVICE',
  33. 'bg_color': color})
  34. self.mainScreen.rvid.data = data
  35. self.current = 'mainScreen'
  36. def switchToLoginScreen(self):
  37. self.current = 'loginScreen'
  38. class MyApp(MDApp):
  39. def build(self):
  40. self.theme_cls.theme_style = 'Dark'
  41. self.theme_cls.primary_palette = 'Blue'
  42. self.theme_cls.accent_palette = 'Amber'
  43. return Builder.load_file('main.kv')
  44. if __name__ == '__main__':
  45. MyApp().run()

main.kv

  1. <LoginScreen>:
  2. name: 'loginScreen'
  3. Button:
  4. text: 'MAIN'
  5. on_release: root.switchButton()
  6. <DailyService>:
  7. bg_color: app.theme_cls.primary_dark
  8. day: ''
  9. service: ''
  10. MDGridLayout:
  11. rows: 2
  12. MDLabel:
  13. halign: 'center'
  14. text: root.day
  15. MDLabel:
  16. halign: 'center'
  17. md_bg_color: root.bg_color
  18. text: root.service
  19. <MainScreen>:
  20. name: 'mainScreen'
  21. rvid: myRv
  22. MDRecycleView:
  23. viewclass: 'DailyService'
  24. id: myRv
  25. RecycleBoxLayout:
  26. default_size: None, dp(200)
  27. default_size_hint: 1, None
  28. size_hint_y: None
  29. height: self.minimum_height
  30. orientation: 'vertical'
  31. Button:
  32. pos_hint: {'x': 0.5, 'bottom': 1}
  33. size_hint: 0.4, 0.1
  34. text: 'LOGIN'
  35. on_release: root.switchButton()
  36. MyScreenManager:
  37. loginScreen: loginScreenId
  38. mainScreen: mainScreenId
  39. LoginScreen:
  40. id: loginScreenId
  41. MainScreen:
  42. id: mainScreenId

Screenshot of the first enter on mainScreen:
Kivy MDLabel 在 RecycleView 中更新数据后丢失文本

Screenshot of the second enter on mainScreen after data update:
Kivy MDLabel 在 RecycleView 中更新数据后丢失文本

英文:

I'm having two screens, loginScreen and mainScreen. In the mainScreen I have a RecycleView of MDLabels. Initially when entering on mainScreen everything works fine, but whenever I'm refreshing the data of my RecycleView, the text of some labels keeps disappearing and appearing on scrolling.
When I use regular kivy labels instead of MDLabels, I'm not getting this strange behavior. Am I doing something wrong in the code or is this expected when using MDLabels in RecycleView?

main.py

  1. from kivymd.app import MDApp
  2. from kivy.lang import Builder
  3. from kivy.uix.screenmanager import ScreenManager
  4. from kivy.uix.screenmanager import Screen
  5. from kivymd.color_definitions import colors
  6. from kivymd.uix.boxlayout import MDBoxLayout
  7. import random
  8. class DailyService(MDBoxLayout):
  9. pass
  10. class MainScreen(Screen):
  11. def __init__(self, **kwargs):
  12. super(MainScreen, self).__init__(**kwargs)
  13. def switchButton(self):
  14. self.manager.switchToLoginScreen()
  15. class LoginScreen(Screen):
  16. def __init__(self, **kwargs):
  17. super(LoginScreen, self).__init__(**kwargs)
  18. def switchButton(self):
  19. self.manager.switchToMainScreen()
  20. class MyScreenManager(ScreenManager):
  21. def __init__(self, **kwargs):
  22. super(MyScreenManager, self).__init__(**kwargs)
  23. #self.current = &#39;loginScreen&#39;
  24. def switchToMainScreen(self):
  25. data = []
  26. for i in range(20):
  27. k = random.randint(0, 9)
  28. if k%2 == 0:
  29. color = colors[&#39;BlueGray&#39;][&#39;700&#39;]
  30. else:
  31. color = colors[&#39;Green&#39;][&#39;700&#39;]
  32. data.append({&#39;day&#39;: &#39;DAY&#39;,
  33. &#39;service&#39;: &#39;SERVICE&#39;,
  34. &#39;bg_color&#39;: color})
  35. self.mainScreen.rvid.data = data
  36. self.current = &#39;mainScreen&#39;
  37. def switchToLoginScreen(self):
  38. self.current = &#39;loginScreen&#39;
  39. class MyApp(MDApp):
  40. def build(self):
  41. self.theme_cls.theme_style = &#39;Dark&#39;
  42. self.theme_cls.primary_palette = &#39;Blue&#39;
  43. self.theme_cls.accent_palette = &#39;Amber&#39;
  44. return Builder.load_file(&#39;main.kv&#39;)
  45. if __name__ == &#39;__main__&#39;:
  46. MyApp().run()

main.kv

  1. &lt;LoginScreen&gt;:
  2. name: &#39;loginScreen&#39;
  3. Button:
  4. text: &#39;MAIN&#39;
  5. on_release: root.switchButton()
  6. &lt;DailyService&gt;:
  7. bg_color: app.theme_cls.primary_dark
  8. day: &#39;&#39;
  9. service: &#39;&#39;
  10. MDGridLayout:
  11. rows: 2
  12. MDLabel:
  13. halign: &#39;center&#39;
  14. text: root.day
  15. MDLabel:
  16. halign: &#39;center&#39;
  17. md_bg_color: root.bg_color
  18. text: root.service
  19. &lt;MainScreen&gt;:
  20. name: &#39;mainScreen&#39;
  21. rvid: myRv
  22. MDRecycleView:
  23. viewclass: &#39;DailyService&#39;
  24. id: myRv
  25. RecycleBoxLayout:
  26. default_size: None, dp(200)
  27. default_size_hint: 1, None
  28. size_hint_y: None
  29. height: self.minimum_height
  30. orientation: &#39;vertical&#39;
  31. Button:
  32. pos_hint:{&quot;x&quot;:0.5,&#39;bottom&#39;: 1}
  33. size_hint: 0.4, 0.1
  34. text: &#39;LOGIN&#39;
  35. on_release: root.switchButton()
  36. MyScreenManager:
  37. loginScreen: loginScreenId
  38. mainScreen: mainScreenId
  39. LoginScreen:
  40. id: loginScreenId
  41. MainScreen:
  42. id: mainScreenId

Screenshot of the first enter on mainScreen:
Kivy MDLabel 在 RecycleView 中更新数据后丢失文本

Screenshot of the second enter on mainScreen after data update:
Kivy MDLabel 在 RecycleView 中更新数据后丢失文本

答案1

得分: 0

问题似乎在使用Kivy和Kivymd的主分支时已解决。

英文:

The issue appears to be solved when using Kivy and Kivymd from the master branch.

huangapple
  • 本文由 发表于 2023年6月18日 23:56:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/76501385.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定