pythonkivymd:如何使toggle_nav_drawer()函数工作?

2024-03-29 11:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我的kv代码有问题。我想用几个NavigationDrawerIconButtons创建一个MDNavigationDrawer。窗口会出现,但当我单击MDToolbar时,程序崩溃并显示此错误消息。在

 Traceback (most recent call last):
   File "C:/Users/path/to/my/file/main.py", line 189, in <module>
     KivyGUI().run()
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\app.py", line 855, in run
     runTouchApp()
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\core\window\window_sdl2.py", line 746, in mainloop
     self._mainloop()
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\core\window\window_sdl2.py", line 478, in _mainloop
     EventLoop.idle()
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\base.py", line 342, in idle
     self.dispatch_input()
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\base.py", line 327, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\base.py", line 293, in post_dispatch_input
     wid.dispatch('on_touch_up', me)
   File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivymd\ripplebehavior.py", line 84, in on_touch_up
     return super().on_touch_up(touch)
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivymd\button.py", line 480, in on_touch_up
     return super().on_touch_up(touch)
   File "C:\Users\uname\Anaconda3\lib\site-packages\kivy\uix\behaviors\button.py", line 179, in on_touch_up
     self.dispatch('on_release')
   File "kivy\_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
   File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1138, in kivy._event.EventObservers._dispatch
   File "C:\Users\path\to\my\file\design.kv", line 59, in <lambda>
     left_action_items: [['dots-vertical', lambda x: root.toggle_nav_drawer()]]
   File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
 AttributeError: 'LayoutPy' object has no attribute 'toggle_nav_drawer'

我从一个单独的文件导入kv代码。在

^{pr2}$

Python代码:

import sys
import kivy
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window
from kivymd.theming import ThemeManager
from kivymd.label import MDLabel
from kivymd.textfields import MDTextField, MDTextFieldClear, MDTextFieldRect, MDTextFieldRound
from kivy.lang import Builder
from kivymd.navigationdrawer import MDNavigationDrawer, NavigationDrawerIconButton, NavigationLayout
from kivy.properties import ObjectProperty
from kivymd.toast import toast

kivy.require('1.11.0')

class LayoutPy(FloatLayout):
    def __init__(self, **kwargs):
        super(LayoutPy, self).__init__(**kwargs)
        self.scr_mngr = ObjectProperty(None)
        self.build_nav_btns()

    def callback(self, instance, value):
        toast("Pressed item menu %d" % value)

    def exit(self):
        sys.exit(1)

    def build_nav_btns(self):
        btns = ["Select Language", "Contact the developer", "Exit"]
        for count, btn in enumerate(btns):
            if count == 1:
                self.ids.nav_drawer.add_widget(
                NavigationDrawerIconButton(
                    icon='settings', text=btn,
                    on_release=lambda x, btn: self.callback(x, btn)))
            elif count == 2:
                self.ids.nav_drawer.add_widget(
                NavigationDrawerIconButton(
                    icon='face', text=btn,
                    on_release=lambda x, btn: self.callback(x, btn)))
            elif count == 3:
                self.ids.nav_drawer.add_widget(
                NavigationDrawerIconButton(
                    icon='close', text=btn,
                    on_release=lambda x: self.exit()))

Builder.load_file("design.kv")

class KivyGUI(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = ("Teal")
    title = ("App")

    def build(self):
        c = LayoutPy()
        return c


if __name__ == "__main__":
    KivyGUI().run()

我对Python代码进行了大量的裁剪,这样对您来说就更清楚了。我不认为这是模块本身的问题,因为KivyMD example code对我来说很好(这也是我运行它时解决方案的外观)。我认为问题是我的LayoutPy类继承了FloatLayout,它没有{}对象。。。但是我现在不知道如何在我现有的代码中实现一个合适的解决方案(我现在正在尝试两天)。如果您需要整个代码(在添加NavigationDrawer之前,一切都很好),您可以看看here。在

先谢谢你!在


Tags: infrompyimportselflibpackagesline
1条回答
网友
1楼 · 发布于 2024-03-29 11:27:00

错误-AttributeError

     left_action_items: [['dots-vertical', lambda x: root.toggle_nav_drawer()]]
   File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
 AttributeError: 'LayoutPy' object has no attribute 'toggle_nav_drawer'

根本原因

对象LayoutPy没有属性toggle_nav_drawer,因为toggle_nav_drawer是在LayoutPy的实例化子级NavigationLayout:中定义的。在

解决方案

{{cd7}替换为

代码段-kv文件

^{pr2}$

输出

Result

相关问题 更多 >