我试图用tkinter开发GUI作为MVC模式,但这对我来说是新的。我在网络上看到了很多示例,但我仍然更喜欢了解它的工作原理。这就是为什么我只是编程一个简单的应用程序来获取它。
开始,我只有树文件控制器。模型仅包含方法/函数;并查看图形界面,我的意思是小部件。
问题是,如果视图类(view.py)具有一个没有命令的按钮,并且该按钮应执行的操作是在模型类(model.py)中,我必须为控制器类(控制器)编写什么。py)获取此操作并将其定为按钮?
view.py文件:
#!/usr/bin/python
# -*- coding:UTF-8 -*-
from Tkinter import*
class View():
def __init__(self, master):
self.master = master
master.title("MAIN GUI")
master.geometry("400x200")
l = Label(master, text="TITLE SCREEN")
l.pack()
b = Button(master, text='Hello')
b.pack()
model.py文件:
#!/usr/bin/python
# -*- coding:UTF-8 -*-
from Tkinter import*
from tkMessageBox import*
class Model():
def __init__(self):
pass
#Greeting() #I don't know if this should be here.
def Greeting(self):
print "Hello world"
def Alert(self):
showinfo ('msg', "Hello world")
Controller.py:
#!/usr/bin/python
# -*- coding:UTF-8 -*-
from view import*
from model import*
class Controller():
def __init__(self, master):
View(root)
Model()
View.b.config(command=Model.Greeting)
#View.b.config(command=self.Action)
def Action(self):
Model.Greeting()
if __name__ == "__main__":
root = Tk()
View(root)
root.mainloop()
如果按钮没有命令,则不会发生任何事情。它需要具有一个命令,该命令调用控制器的函数。
然后,控制器将通过与模型进行通信或触发另一个视图来执行此命令。
由于该按钮将调用控制器的函数,因此需要意识到它。假设您将其传递给参数,并且您希望按钮触发controller.Action
,controller
是Controller
的(?)实例。
这是您的视图的样子:
class View():
def __init__(self, master, controller):
self.master = master
self.controller = controller
b = Button(master, text='Hello', command=self.controller.Action())
b.pack()
然后,单击按钮将导致呼叫Action
。
您可以在控制器 init ()函数中使用此功能:
self.view.b.bind("<Button>",self.action)
这样,您不必在视图中使用命令。
我仍在努力弄清楚如何为梅纳布尔顿(Menubuttons)做这件事...所以如果这对您来说是新的(就像我对我一样),这可能会有些挣扎。
编辑:根据要求,一个小样本:
import tkinter as tk
# Data stuff
class Model():
def __init__(self):
pass
# GUI
class View():
def __init__(self, master):
self.master = master
self.b = tk.Button(self.master, text="quit")
self.b.pack()
# Logic of the app
class Controller():
def __init__(self):
self.root = tk.Tk()
self.model=Model()
self.view=View(self.root)
self.view.b.bind("<Button>",self.action)
self.run()
def run(self):
self.root.mainloop()
def action(self,event):
self.root.destroy()
if __name__ == '__main__':
c = Controller()