App是用Python 3.9.5、Kivy 2.0.0rc4和KivyMD 0.104.2制作的。我做了KivyMD按钮。有了它,你可以切换暗/光模式。但这是打印错误和懒惰的原因。我是说,这对另一个帮我做事的家伙很管用。但对我不起作用。我玩了一会儿,只在这个MainWidget类上尝试切换暗/光模式。我想切换整个应用程序。这是我的Kivy代码:
<MainWidget>:
MDScreen:
id: screenId
md_bg_color: 0, 0, 0, 1
MDIconButton:
id: light_mode
icon: "brightness-4"
user_font_size: "64sp"
theme_text_color: "Custom"
text_color: 1, 1, 1, 1
on_press: app.presser()这是我的Python代码:
class MainWidget(MDFloatLayout):
pass
class MyApp(MDApp):
pressed = False
def build(self):
self.theme_cls.theme_style = "Dark"
self.screen_manager = ScreenManager()
self.mainwidget = MainWidget()
screen = Screen(name='First')
screen.add_widget(self.mainwidget)
self.screen_manager.add_widget(screen)
def presser(self):
if self.pressed:
self.root.ids.light_mode.text_color = 0, 0, 0, 1
self.root.ids.screenId.md_bg_color = 1, 1, 1, 1
self.pressed = not self.pressed
else:
self.root.ids.light_mode.text_color = 1, 1, 1, 1
self.root.ids.screenId.md_bg_color = 0, 0, 0, 1
self.pressed = not self.pressed这是error
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\guram\Desktop\WordBondV.2\main.py", line 815, in <module>
myapp.run()
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\app.py", line 950, in run
runTouchApp()
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\base.py", line 582, in runTouchApp
EventLoop.mainloop()
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\base.py", line 347, in mainloop
self.idle()
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\base.py", line 391, in idle
self.dispatch_input()
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\base.py", line 342, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\base.py", line 248, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\core\window\__init__.py", line 1412, in on_motion
self.dispatch('on_touch_down', me)
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\core\window\__init__.py", line 1428, in on_touch_down
if w.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\uix\screenmanager.py", line 1198, in on_touch_down
return super(ScreenManager, self).on_touch_down(touch)
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\uix\relativelayout.py", line 297, in on_touch_down
ret = super(RelativeLayout, self).on_touch_down(touch)
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivymd\uix\behaviors\ripple_behavior.py", line 255, in on_touch_down
super().on_touch_down(touch)
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivymd\uix\button.py", line 969, in on_touch_down
return super().on_touch_down(touch)
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
self.dispatch('on_press')
File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
File "kivy\_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
File "C:\Users\guram\Desktop\WordBondV.2\venv\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
exec(__kvlang__.co_value, idmap)
File "C:\Users\guram\Desktop\WordBondV.2\my.kv", line 32, in <module>
on_press: app.presser()
File "C:\Users\guram\Desktop\WordBondV.2\main.py", line 810, in presser
self.root.ids.light_mode.text_color = 1, 1, 1, 1
File "kivy\properties.pyx", line 864, in kivy.properties.ObservableDict.__getattr__
AttributeError: 'super' object has no attribute '__getattr__'发布于 2021-07-03 16:52:27
我建议将根小部件保留在kv代码中,这样您就可以在ids dict中遍历可用的id。在您的代码中,它无法找到那些id。
下面是代码的工作版本:
我已经将kivy和python代码合并到一个文件中,但是您可以使用obv。分离它们,然后使用Builder.load_file(kivy_file_name)加载您的kivy文件。
from kivymd.app import MDApp
from kivymd.uix.floatlayout import MDFloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
kv="""
ScreenManager:
Screen:
name: 'First'
MainWidget:
id: my_widget
<MainWidget>:
MDScreen:
id: screenId
md_bg_color: 0, 0, 0, 1
MDIconButton:
id: light_mode
icon: "brightness-4"
user_font_size: "64sp"
theme_text_color: "Custom"
text_color: 1, 1, 1, 1
on_press: app.presser()
"""
class MainWidget(MDFloatLayout):
pass
class MyApp(MDApp):
pressed = False
def build(self):
self.theme_cls.theme_style = "Dark"
self.screen_manager = Builder.load_string(kv) # ScreenManager()
#self.mainwidget = MainWidget()
#screen = Screen(name='First')
#screen.add_widget(self.mainwidget)
#self.screen_manager.add_widget(screen)
return self.screen_manager
def presser(self):
if self.pressed:
self.root.ids.my_widget.ids.light_mode.text_color = 0, 0, 0, 1
self.root.ids.my_widget.ids.screenId.md_bg_color = 1, 1, 1, 1
self.pressed = not self.pressed
else:
self.root.ids.my_widget.ids.light_mode.text_color = 1, 1, 1, 1
self.root.ids.my_widget.ids.screenId.md_bg_color = 0, 0, 0, 1
self.pressed = not self.pressed
if __name__ == '__main__':
MyApp().run()发布于 2021-07-07 05:48:07
您的代码中有太多错误
别担心,我帮你解决了;)
这里是更正的代码:)
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivymd.app import MDApp
kv = """
<MainWidget>:
screenId: screenId
light_mode: light_mode
MDFloatLayout:
MDScreen:
id: screenId
md_bg_color: 0, 0, 0, 1
MDIconButton:
id: light_mode
icon: "brightness-4"
user_font_size: "64sp"
theme_text_color: "Custom"
text_color: 1, 1, 1, 1
on_press: root.presser()
"""
Builder.load_string(kv)
sm = ScreenManager()
class MainWidget(Screen):
pressed = False
screenId = ObjectProperty(None)
light_mode = ObjectProperty(None)
def presser(self):
if self.pressed:
self.light_mode.text_color = 0, 0, 0, 1
self.screenId.md_bg_color = 1, 1, 1, 1
self.pressed = not self.pressed
else:
self.light_mode.text_color = 1, 1, 1, 1
self.screenId.md_bg_color = 0, 0, 0, 1
self.pressed = not self.pressed
class MyApp(MDApp):
def build(self):
self.theme_cls.theme_style = "Dark"
sm.add_widget(MainWidget(name="First"))
return sm
MyApp().run()您不需要总是使用root.ids.widgetid!
您可以在您的kivy文件中将小部件定义为全局小部件,以便可以使用ObjectProperty在python文件中访问它。
此外,最佳实践是定义根类本身中属于特定类的所有方法:)
https://stackoverflow.com/questions/68233144
复制相似问题