2016-07-26 45 views
1

我想用tkinter構建一個簡單的GUI來讀取CSV文件,然後運行一些文本挖掘功能。我很難理解tkinter的回調函數。下面的代碼是使用這個ToyMVC代碼創建的。使用tkinter,MVC和Observables設置Entry的值

我能夠得到彈出的GUI,但一旦用戶按下按鈕,無法從最左邊的Widget獲取用戶輸入的文本來更新最右邊的Entry小部件(變量名= 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() 

編輯:使用下面的答案,我有固定我的代碼。這裏是更新和工作片斷:

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

您需要修復代碼的縮進。 –

回答

1

一件事這個代碼似乎是顯而易見的:開始的功能在

def addcallback(self, func): 

直到

def unset(self): 

不是可觀察類的一部分。所以「自我」的論點並不是你期望的那樣。你應該縮進這些功能。