【问题标题】:KivyMD 'MDMenuItem' object has no attribute 'text'KivyMD 'MDMenuItem' 对象没有属性 'text'
【发布时间】:2019-02-23 06:22:45
【问题描述】:

我想点击 MDMenuItem 来获取文本或做某事。 但是一个错误说“AttributeError:'MDMenuItem'对象没有属性'text'”

这样的.py文件

class MDMenuItem(Widget):
    pass

class MyScreen(Screen):
    menu_items = [
    {'viewclass': 'MDMenuItem',
     'text': 'text1'},
    {'viewclass': 'MDMenuItem',
     'text': 'text2'},
    ]

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)

.kv 文件如下:

#:import MDDropdownMenu kivymd.menu.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton
<MDMenuItem>:
    on_release: root.change_variable(self.text)

<MyScreen>:
    name: myscrn
    MDRaisedButton:
        size_hint: None, None
        size: 3 * dp(48), dp(48)
        text: 'MDButton'
        opposite_colors: True
        pos_hint: {'center_x': 0.5, 'center_y': 0.5}
        on_release: MDDropdownMenu(items=root.menu_items, width_mult=4).open(self) 

我该怎么办?

编辑: 感谢你的回复。就我而言,这个 .py 子程序不是内容“应用程序”。我不想将方法放入 main.py,因为我希望 main.py 保持干净。(只是内容导入、builder.load_file、add_wiget...)

所以我想在不使用“app.something”的情况下调用方法。 我可以使用 root.something 或其他方法调用 change_variable 并获取文本吗?

【问题讨论】:

    标签: python-3.x kivy kivy-language


    【解决方案1】:

    我删除了 MDMenuItem 类并将“root.change_variable”更改为“app.root.get_screen('MyScreen').change_variable”。是工作!!! 在这种情况下,“app.root”被视为“screen.manager”。我不知道为什么,但它确实有效。

    .py

    class MyScreen(Screen):
    
        menu_items = [
            {'viewclass': 'MDMenuItem',
            'text': 'text1'},
            {'viewclass': 'MDMenuItem',
            'text': 'text2'},
        ]
    
        def change_variable(self, value):
            print("\nvalue=", value)
            self.VARIABLE = value
            print("\tself.VARIABLE=", self.VARIABLE)
    

    .kv

    #:import MDDropdownMenu kivymd.menu.MDDropdownMenu
    #:import MDRaisedButton kivymd.button.MDRaisedButton
    <MDMenuItem>:
        on_release: app.root.get_screen("MyScreen").change_variable(self.text)
    

    【讨论】:

      【解决方案2】:

      注意:

      下面的解决方案是使用KivyMD version 0.1.2。

      属性错误

      AttributeError: 'MDMenuItem' 对象没有属性 'text'

      错误是由于类 MDMenuItem 的定义错误。它是通过继承一个不具有“文本”属性的 Widget 来定义的。

      MDMenuItem的实际定义

      from kivy.uix.recycleview.views import RecycleDataViewBehavior
      from kivy.uix.button import ButtonBehavior
      from kivy.uix.boxlayout import BoxLayout
      from kivy.properties import StringProperty
      
      
      class MDMenuItem(RecycleDataViewBehavior, ButtonBehavior, BoxLayout):
          text = StringProperty()
      

      解决方案

      main.py 中不需要定义类 MDMenuItem。删除它,程序就会运行。

      示例

      main.py

      ​​>
      from kivy.app import App
      from kivymd.theming import ThemeManager
      from kivy.uix.screenmanager import Screen
      
      
      class MyScreen(Screen):
          VARIABLE = ""
      
          menu_items = [
          {'viewclass': 'MDMenuItem',
           'text': 'text1'},
          {'viewclass': 'MDMenuItem',
           'text': 'text2'},
          ]
      
          def change_variable(self, value):
              print("\nvalue=", value)
              self.VARIABLE = value
              print("\tself.VARIABLE=", self.VARIABLE)
      
      
      class MainApp(App):
          title = "KivyMD MDDropdownMenu Demo"
          theme_cls = ThemeManager()
      
          def build(self):
              return MyScreen()
      
      
      if __name__ == "__main__":
          MainApp().run()
      

      main.kv

      #:kivy 1.11.0
      #:import MDDropdownMenu kivymd.menu.MDDropdownMenu
      #:import MDRaisedButton kivymd.button.MDRaisedButton
      
      <MDMenuItem>:
          on_release: app.root.change_variable(self.text)
      
      <MyScreen>:
          name: 'myscrn'
          MDRaisedButton:
              size_hint: None, None
              size: 3 * dp(48), dp(48)
              text: 'MDButton'
              opposite_colors: True
              pos_hint: {'center_x': 0.5, 'center_y': 0.5}
              on_release: MDDropdownMenu(items=root.menu_items, width_mult=4).open(self)
      

      输出

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        • 2018-09-10
        • 1970-01-01
        相关资源
        最近更新 更多