首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这个网站的某个人的帮助下,我用KivyMD制作了Python按钮。这对他来说是完美的,但对我来说有些不对劲。

在这个网站的某个人的帮助下,我用KivyMD制作了Python按钮。这对他来说是完美的,但对我来说有些不对劲。
EN

Stack Overflow用户
提问于 2021-07-03 04:04:28
回答 2查看 237关注 0票数 1

App是用Python 3.9.5Kivy 2.0.0rc4KivyMD 0.104.2制作的。我做了KivyMD按钮。有了它,你可以切换暗/光模式。但这是打印错误和懒惰的原因。我是说,这对另一个帮我做事的家伙很管用。但对我不起作用。我玩了一会儿,只在这个MainWidget类上尝试切换暗/光模式。我想切换整个应用程序。这是我的Kivy代码:

代码语言:javascript
复制
<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代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
 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__'
EN

回答 2

Stack Overflow用户

发布于 2021-07-03 16:52:27

我建议将根小部件保留在kv代码中,这样您就可以在ids dict中遍历可用的id。在您的代码中,它无法找到那些id

下面是代码的工作版本:

我已经将kivy和python代码合并到一个文件中,但是您可以使用obv。分离它们,然后使用Builder.load_file(kivy_file_name)加载您的kivy文件。

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2021-07-07 05:48:07

您的代码中有太多错误

别担心,我帮你解决了;)

这里是更正的代码:)

代码语言:javascript
复制
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文件中访问它。

此外,最佳实践是定义根类本身中属于特定类的所有方法:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68233144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档