我对tkinter有两个模块中分离UI和UI功能的问题,这是我的代码:
1-view.py
from tkinter import *
class View():
def __init__(self,parent):
self.button=Button(parent,text='click me').pack()
2.controller.py
from tkinter import *
from view import *
class Controller:
def __init__(self,parent):
self.view1=View(parent)
self.view1.button.config(command=self.callback)
def callback(self):
print('Hello World!')
root=Tk()
app=Controller(root)
root.mainloop()
在运行controller.py时出现以下错误:
AttributeError:'NoneType'对象没有属性'config'
任何建议?
我也尝试使用lambda在另一个模块中使用回调函数,但它没有用。
提前致谢
答案 0 :(得分:2)
lambda逼近问题完全如上所述,现在通过在新行中使用包来解决。它看起来更漂亮,这里是使用lambda的样本工作正常:
1.view.py
from tkinter import *
from controller import *
class View():
def __init__(self,parent):
button=Button(parent,text='click me')
button.config(command=lambda : callback(button))
button.pack()
root=Tk()
app=View(root)
root.mainloop()
2.controller.py
def callback(button):
button.config(text='you clicked me!')
print('Hello World!')
使用这种方法,我们可以将所有功能从UI移开并使其清晰可读。
答案 1 :(得分:1)
在view.py中,您正在呼叫:
self.button=Button(parent,text='click me').pack()
pack函数不会返回要分配给self.button的Button对象,这会导致稍后出现AttributeError。你应该这样做:
self.button = Button(parent, text='click me')
self.button.pack()