【发布时间】:2020-07-27 09:20:55
【问题描述】:
我在尝试使用 python 中的 kivy 库从另一个类中调用定义在一个类中的“屏幕切换”函数时遇到了 AttributionError。
我的代码结构如下:
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.app import App
def init_grid(width, height, mines):
global grid_field
global flagged
# Initiate the gird field with empty grids
grid_field = [[ClassA() for i in range(width)] for j in range(height)]
flagged = 0
...
class Main(App):
def build(self):
sm = ScreenManager()
current = Current(name="current")
screenA = ScreenA(name="screenA")
screenB = ScreenB(name="screenB")
...
...
sm.add_widget(current)
sm.add_widget(screenA)
sm.add_widget(screenB)
...
...
sm.current = "current"
return sm
...
class ClassA():
# a class my code is at when the error arises,
# which is not the starting "current" screen class
# but a different class that serves a certain purpose to my program
def __init__(self, **kwargs):
...
...
self.button = Button()
self.button.bind(on_touch_down=self.method)
def method(self, instance, touch):
if (a condition):
ScreenA().change_to_B()
...
...
class ScreenA(Screen):
def __init__(self, **kwargs):
Screen.__init__(self, **kwargs)
...
...
init_grid(10, 10, 10)
def change_to_B(self):
self.manager.transition.direction = "left"
self.manager.current = "screenB"
...
class ScreenB(Screen):
def __init__(self, **kwargs):
Screen.__init__(self, **kwargs)
...
...
if __name__ == '__main__':
Main().run()
错误信息是:
in change_to_B
self.manager.transition.direction = "left"
AttributeError: 'NoneType' object has no attribute 'transition'
在上面的代码中,我在ScreenA 类中定义了屏幕切换函数change_to_B,并在ClassA 类中调用了这个函数。我在我创建的ScreenA 和ScreenB 两个类中都继承了Screen 父类。但奇怪的是,错误消息似乎表明对象screenA 是NoneType 对象,这不应该是这种情况,因为我在通过继承Screen 父级创建类时声明它是屏幕对象类。
谁能指出我错过了什么错误?提前谢谢!!!
编辑:
我想我需要弄清楚我的代码。所以我基本上是在尝试写扫雷游戏,ClassA是扫雷游戏板组成的网格,它有一个Button属性来实现点击功能method(如上代码所示) .在点击函数method中,我试图调用类ScreenA中定义的屏幕切换函数change_to_B(),这是在ScreenManager的build方法中声明的屏幕对象(我认为)。
代码流程为:Current(name="current")(与本题无关) --> ScreenA(name="screenA"),其中ClassA()是在全局列表变量中创建的函数 init_grid() --> ClassA(),点击 UI 调用绑定到 ClassA() 对象的 Button 属性的函数。
ClassA 对象在函数init_grid 中创建,其中创建了一个全局变量grid_field 以将ClassA 对象存储在一个二维列表中。
【问题讨论】:
标签: python class user-interface inheritance kivy