如何在python tkinter中分离视图和控制器?

时间:2013-07-11 15:48:56

标签: python model-view-controller python-3.x lambda tkinter

我对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在另一个模块中使用回调函数,但它没有用。

提前致谢

2 个答案:

答案 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()