如何将模型操作传递到TKINTER MVC中的查看按钮



我试图用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.ActioncontrollerController的(?)实例。

这是您的视图的样子:

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

最新更新