0

tkinter プログラムの MVC 構造を作成しようとしています。

次のように、マウスクリックのイベントバインディングを持つビュークラスがあります

class View():
    def __init__(self, root)
        self.canvas = Canvas(root)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.select)

     def select(self):
        # do some thing

別のクラス「コントローラー」があります

class Controller:
    def __init__(self, root):
        self.model = model.Model()
        self.view = view.View(self.model)
        #root.bind_class("Canvas", "<Button-1>", self.view.select)

イベント バインディングをビューからコントローラーに移動する必要があります。ビュー クラスで作成されたキャンバス ウィジェットをコントローラー クラスからバインドするにはどうすればよいですか?

を使用して Canvas ウィジェット全体をイベントにバインドすることにより、コントローラー クラスで一時的な解決策を考え出しましたroot.bind_class("Canvas", "<Button-1>", self.view.select)

現在、私の GUI にはキャンバス ウィジェットが 1 つしかなく、これは正常に機能します。ただし、後でキャンバスを追加すると、問題が発生する可能性があります。

4

2 に答える 2

2

MVC パターンでは、コントローラーは、ビューとの対話によって発生したユーザー イベントに応答する必要があります。したがって、そのアプローチに従いたい場合selectは、コントローラーにある必要があり、ビューはコントローラーのどのアクションが応答する必要があるかを知るだけで済みます。

class View():
    def __init__(self, master, controller):
        self.canvas = Canvas(root)
        self.canvas.pack()
        self.canvas.bind("<Button-1>", controller.select)

class Controller():
    def __init__(self, master):
        self.model = model.Model()
        self.view = view.View(master, self)
    def select(self, event):
        canvas = event.widget
        # ...

View オブジェクトを作成した後にコントローラーにバインドすることもでき<Button-1>ますが、コントローラーのコードをビューに結合しています (コントローラーは、View が常にself.canvas属性を持っていることを認識している必要があります)。

于 2013-06-15T22:18:06.193 に答える
0

tkinter を使用して MVC を実装しようと懸命に努力した結果、MVC が GUI プログラミングに最適ではない理由に関する記事に出会いました。

「しかし、従来の MVC スコープは、GUI >要素 (ウィジェット) の制御に関しては不十分です。MVC は、データ管理、イベント > 管理、およびアプリケーション フローの複雑さを処理しません。MVC トライアドの適応として、 HMVC -- >Hierarchical-Model-View-Controller -- パラダイムは、上記の問題のいくつかを是正しようとしています。"

Jason Cai、Ranjit Kapila、および Gaurav Pal (2000 年 7 月)。「HMVC:強力なクライアント層を開発するためのレイヤード パターン」. JavaWorld マガジン。

于 2013-06-16T01:43:09.217 に答える