3

我对 tkinter 有一个关于在两个模块中分离 UI 和 UI 功能的问题,这是我的代码:

1-view.py

from tkinter import *

class View():
    def __init__(self,parent):
        self.button=Button(parent,text='click me').pack()

2.控制器.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 在另一个模块中使用回调函数,但它不起作用。

提前致谢

4

2 回答 2

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.控制器.py

def callback(button):
    button.config(text='you clicked me!')
    print('Hello World!')

使用这种方法,我们可以将所有功能从 UI 中移开,并使其干净易读。

于 2013-07-12T05:17:52.587 回答
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()
于 2013-07-11T17:26:04.150 回答