Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用tkinter、MVC和可观测值设置输入值_Python 3.x_User Interface_Model View Controller_Tkinter - Fatal编程技术网

Python 3.x 使用tkinter、MVC和可观测值设置输入值

Python 3.x 使用tkinter、MVC和可观测值设置输入值,python-3.x,user-interface,model-view-controller,tkinter,Python 3.x,User Interface,Model View Controller,Tkinter,我正在尝试使用tkinter构建一个简单的GUI来读取CSV,然后运行一些文本挖掘功能。我很难理解tkinter的回调函数。以下代码是使用此ToyMVC代码创建的 我能够让GUI弹出,但在用户按下按钮后,我很难让最右边的条目小部件(变量名=finalPathEntry)使用用户从左边小部件输入的文本进行更新 我将非常感谢任何关于如何前进和我做错了什么的建议 最好的 编辑:使用下面的答案,我已经修复了我的代码。以下是更新后的工作代码段: import tkinter as tk class Ob

我正在尝试使用tkinter构建一个简单的GUI来读取CSV,然后运行一些文本挖掘功能。我很难理解tkinter的回调函数。以下代码是使用此ToyMVC代码创建的

我能够让GUI弹出,但在用户按下按钮后,我很难让最右边的条目小部件(变量名=finalPathEntry)使用用户从左边小部件输入的文本进行更新

我将非常感谢任何关于如何前进和我做错了什么的建议

最好的

编辑:使用下面的答案,我已经修复了我的代码。以下是更新后的工作代码段:

import tkinter as tk

class Observable:
    def __init__(self, initialValue = None):
        self.data = initialValue
        self.callbacks = {}

    def addCallback(self, func):
        self.callbacks[func] = 1

    def delCallback(self, func):
        del self.callback[func]

    def _docallbacks(self):
        for func in self.callbacks:
            func(self.data)

    def set(self, data):
        self.data = data
        self._docallbacks()

    def get(self):
        return self.data

    def unset(self):
        self.data = None

class Model:
    def __init__(self):
        self.csvPath = Observable("")

    def addPath(self, value):
        self.csvPath.set(self.csvPath.get())

class View(tk.Toplevel):
    def __init__(self, master):
        tk.Toplevel.__init__(self, master)
        self.protocol('WM_DELETE_WINDOW', self.master.destroy)
        tk.Label(self, text='Please input path to CSV').pack(side='left')
        self.pathEntry = tk.Entry(self, width=50)
        self.pathEntry.pack(side='left')
        self.addButton = tk.Button(self, text='Read CSV', width=8)
        self.addButton.pack(side='left')
        self.path = tk.StringVar()
        self.finalPathEntry = tk.Entry(self, width = 30, textvariable = self.path)
        self.finalPathEntry.pack(side='left')

    def setPath(self, value):
        self.path.set(str(value))

class Controller:
    def __init__(self, root):
        self.model = Model()
        self.model.csvPath.addCallback(self.pathChanged)
        self.view1 = View(root)
        self.view1.minsize(width = 500, height = 500)
        self.view1.addButton.config(command = self.addPath)
        self.pathChanged(self.model.csvPath.get())

    def addPath(self):
        self.model.addPath(self.view1.pathEntry.get())

    def pathChanged(self, val):
        self.view1.setPath(val)

if __name__ == '__main__':
    root = tk.Tk()
    root.withdraw()
    app = Controller(root)
    root.mainloop()

这段代码有一点很明显:函数从

def addcallback(self, func): 
直到


不是可观察类的一部分。所以“自我”论证不是你所期望的。您应该缩进这些函数。

您需要修复代码的缩进。
def addcallback(self, func): 
def unset(self):