首页 > 解决方案 > 在另一个类的方法中使用一个类的方法时出现 AttributeError

问题描述

更新:我最初在 DrawerList 类的 set_color_item 方法中调用 ProofApp 的 change_screen 方法时遇到问题。我终于找到了一种可行的方法。这是我收到的错误:

AttributeError: type object 'ProofApp' has no attribute 'list_items'

这是原始代码的非常简化的视图:

from kivymd.app import MDApp
from kivymd.theming import ThemableBehavior
from kivy.lang import Builder
from kivymd.uix.list import MDList, OneLineListItem, TwoLineListItem, ThreeLineListItem, ThreeLineIconListItem, \
    OneLineIconListItem
from kivy.core.window import Window
from proof_nav import proof_helper
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty


class DrawerList(ThemableBehavior, MDList):
    def set_color_item(self, instance_item):
        instance_item.text_color = self.theme_cls.primary_color

        if instance_item.text == "Proofs":
            self.parent.parent.nav_drawer.set_state('close')
            self.parent.parent.screen_manager.current = 'screen2'
            ProofApp.change_screen(ProofApp, instance_item)


class ProofApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__()
        self.list_items = {
        'drawer_items': {
            "Menu": {'icon': "home", 'screen': 'menu'},
            "Starred": {'icon': "star", 'screen': 'menu'},
            "Proofs": {'icon': "folder", 'screen': 'screen2'},
            "Other": {'icon': "android", 'screen': 'menu'}
            }
          }

    

    def build(self):
        screen = Builder.load_string(proof_helper)
        return screen

    def change_screen(self, instance_item):
        if instance_item.text in self.list_items:
            print(instance_item.text)
        print("not in list")

    def on_start(self):

        self.list_items = {
            'drawer_items': {
                "Menu": {'icon': "home", 'screen': 'menu'},
                "Starred": {'icon': "star", 'screen': 'menu'},
                "Proofs": {'icon': "folder", 'screen': 'screen2'}

        }
        drawer_items = self.list_items['drawer_items']

ProofApp().run()

我在修订中所做的不同之处在于将 list_items 设为类属性并在我的 DrawerList 类中实例化一个 ProofApp 对象以调用 ProofApp 中的 change_screen 方法。

更新后的代码:

from kivymd.app import MDApp
from kivymd.theming import ThemableBehavior
from kivy.lang import Builder
from kivymd.uix.list import MDList, OneLineListItem, TwoLineListItem, ThreeLineListItem, ThreeLineIconListItem, \
    OneLineIconListItem
from kivy.core.window import Window
from proof_nav import proof_helper
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, StringProperty


class DrawerList(ThemableBehavior, MDList):
    def set_color_item(self, instance_item):
        instance_item.text_color = self.theme_cls.primary_color

        e1 = ProofApp()
        if instance_item.text == "Proofs":
            self.parent.parent.nav_drawer.set_state('close')
            self.parent.parent.screen_manager.current = 'screen2'
            e1.change_screen(instance_item)


class ProofApp(MDApp):
    list_items = {
            'drawer_items': {
                "Menu": {'icon': "home", 'screen': 'menu'},
                "Starred": {'icon': "star", 'screen': 'menu'},
                "Proofs": {'icon': "folder", 'screen': 'screen2'}
        }

    def __init__(self, **kwargs):
        super().__init__()
        self.list_items = {
        'drawer_items': {
            "Menu": {'icon': "home", 'screen': 'menu'},
            "Starred": {'icon': "star", 'screen': 'menu'},
            "Proofs": {'icon': "folder", 'screen': 'screen2'},
            "Other": {'icon': "android", 'screen': 'menu'}
            }
          }



    def build(self):
        screen = Builder.load_string(proof_helper)
        return screen

    def change_screen(self, instance_item):
        if instance_item.text in self.list_items:
            print(instance_item.text)
        print("not in list")

    def on_start(self):
        drawer_items = self.list_items['drawer_items']

ProofApp().run()

标签: pythonkivykivymd

解决方案


认为这里的问题是,当您调用属于“ProofApp”类的“change_screen”方法时,您还没有在对象空间中提供“list_items”属性。要解决“属性错误”,您可以执行以下任一操作:

  1. 确保在调用“change_screen”方法之前调用“ProofApp”类的“on_start”方法
  2. 您可以覆盖或更新 MDApp(ProofApp 的 Super 类)的 init 方法。
  3. 您可以在 change_screen 方法中调用 on_start 方法,可能在顶部

推荐阅读