2017-11-05 9 views
0

わかりやすくするために、私はプログラムを2つの小さなクラスに単純化しました:単一のボタンを持つGUIと、 GUIがコントローラと通信できるようにするために、コントローラには独自のインスタンスがありますが、そのコントローラをGUIに戻すにはどうしたらいいですか?PythonのGUIクラスとコントローラクラスの間の双方向通信

class Controller(): 
def buttonClicked(self): 
    # btn['bg'] = 'blue' - how do I reference the button? 


class GUI(): 
def __init__(self,master): 
    self.master = master 
    self.controller = Controller() 
    self.btn = tk.Button(master,command=self.controller.buttonClicked()) 
    self.btn.pack() 


root = tk.Tk() 
GUI(root) 
root.mainloop() 
+0

なぜ、 'buttonClicked'メソッドをGUIクラスではなく別のクラスにしたいのですか? –

+0

ところで、古いスタイルではなく新しいスタイルのクラスを使用するのは良い考えです。 Python 2では、 'class controller(object):'のようにクラスに 'object'を継承させることでそれを行うことができます。 Python 3では、すべてのクラスが新しいスタイルです。 –

+0

@ PM2Ring私は学校のプロジェクトにモデルビューコントローラのパターンを使用しようとしています – Charley

答えて

1

あなたが別のクラスを使用しない場合は、単にGUIbuttonClickedを追加し、self.btnを経由して、ボタンを参照することができます。

別のクラスが必要な場合は、その属性を使用するためにメインクラスの参照を渡す必要があります。

class Controller(): 
    def __init__(self, gui): 
     self.gui = gui 
    def buttonClicked(self): 
     self.gui.btn['bg'] = 'blue' 


class GUI(): 
    def __init__(self,master): 
     self.master = master 
     self.controller = Controller(self) 
     self.btn = tk.Button(master,command=self.controller.buttonClicked) 
     self.btn.pack() 


root = tk.Tk() 
GUI(root) 
root.mainloop() 

Controllerselfを渡すことによって、Controllerのインスタンスは、ボタンを含むすべての変数を、使用、およびそれらを編集することができます。

上記の変更されたコードで行ったボタンのコマンドを定義する際には、self.controller.buttonClickedへの呼び出しも削除する必要があります。

関連する問題