python - 在另一个类的方法中使用一个类的方法时出现 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()
解决方案
认为这里的问题是,当您调用属于“ProofApp”类的“change_screen”方法时,您还没有在对象空间中提供“list_items”属性。要解决“属性错误”,您可以执行以下任一操作:
- 确保在调用“change_screen”方法之前调用“ProofApp”类的“on_start”方法
- 您可以覆盖或更新 MDApp(ProofApp 的 Super 类)的 init 方法。
- 您可以在 change_screen 方法中调用 on_start 方法,可能在顶部
推荐阅读
- python - 从数据集 Python 中获取缺失的日期时间 - 数据系列
- javascript - 网络说 Dom 内容已加载。Console.log 不记录到开发者控制台。调试器没有命中。未调用函数
- scikit-learn - 升级的 sklearn 使我之前的 onehotencoder 无法转换
- java - JAVA 序列化和反序列化:在一个文件下有自己的数组列表的两个独立对象
- android - 如何在recyclerview中显示所有复选框?
- sql - 如何将 UNIX 纪元日转换为 Snowflake 中的 DATE?
- wavesplatform - 如何从其他 Waves Oracle 读取数据?
- pentaho - 如何用百万个寄存器在 Pentaho 中搜索寄存器
- sql - postgres SQL 中的函数
- python - 如何使用复杂的条件以有效的方式在熊猫中逐列填充?