1

私は、tkinterを使って単純なGUIを構築して、CSVで読み込んだり、テキストマイニング機能を実行しようとしています。私はtkinterのコールバック関数を理解するのが難しいです。このToyMVCコードを使用して次のコードを作成しました。tkinter、MVC、Observablesを使ったエントリの設定値

GUIをポップアップ表示させることはできますが、ユーザーがボタンを押すと、左ウィジェットからユーザーが入力したテキストで更新するために右端の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() 

EDIT:以下の答えを使用して、私は自分のコードを修正しました。ここで更新され、作業抜粋です:このコードについて

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 unset(self): 

まで

def addcallback(self, func): 

で始まる関数は、観察可能なクラスの一部ではありません。したがって、「自己」議論はあなたが期待するものではありません。これらの関数をインデントする必要があります。

関連する問題