2017-11-03 3 views
1

StringVar、BooleanVar、DoubleVarのようなMyValueVar型を作成することが可能かどうか疑問に思っていました...独自のTkinterカスタムトラッキング変数型を使用することは可能ですか?

私はPythonのプログラミングの半分ですほぼ完成したTkinterのGUIアプリケーション開発のブループリント。私はまた、インターネット上でGoogleとそのようなデータ型を作成する方法についての情報を発見していない。

私の望むのは、ビジュアルコンポーネントに接続できるクラス(ミックスインクラスかもしれない)と、ビジュアルコンポーネントが変更されるたびにカスタムクラスオブジェクトのインスタンスである内部値変更。ビジュアルコンポーネントと同期されるMyValueVar型の変数を持つのが理想的です。

は、それは私が全体的に、いくつかのドキュメントは、に固執し、実装し、する必要がどのクラスとメソッドまたはインタフェースを知っている私には十分だろう。あなたが本当に必要なのは、通知ビジュアルコンポーネントの変更があるようなコメントに基づいて予め

+0

変数である必要がありますか?ビジュアルコンポーネントが変更されるたびにバインドできるイベントが発生することも同様に機能しますか?ビジュアルコンポーネントが変更され、内部値が変更されると、何が表示されますか?この変数を作成して値を変更すると、その変数はどのように使用されますか?言い換えれば、 "はい、それは可能です"。それを行う方法は、あなたが実際にやろうとしていることによって決まります。 –

+0

私はあなたの視点を理解することができます。ビジュアルコンポーネントを作成するときは、StringVarの場合と同様に、カスタム変数をバインドします。そして、私はこの変数を必要に応じて使用するか、または渡す必要があります。 – madtyn

+0

バインディングを使用しているので、特別な変数を使用する必要がありますか?バインドされた関数はコンポーネントから直接値を取得できませんか?言い換えれば、 'MyVariable.get'の代わりに' MyComponent.get'を使用することができます。より単純な解決策があるように見える場合、なぜこれを特別な変数にしなければならないのですか? –

答えて

2

おかげで、それが聞こえます。これは仮想イベントで行うことができます。

ここでは、コンポーネントの色が変わったときにラベルを更新する例を示します。毎秒コンポーネントはランダムな色を選択します。それが現在の色と異なる場合、それは変更され、メインプログラムがリッスンしているイベントを送信します。イベントが検出されると、ラベルが更新されます。

import tkinter as tk 
import random 

COLORS = ("red", "green", "yellow") 
class Component(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     self.value = self.cget("background") 
     self.after(1000, self.maybe_change) 

    def maybe_change(self): 
     new_color = random.choice(COLORS) 
     if self.value != new_color: 
      self.value = new_color 
      self.configure(background=new_color) 
      self.event_generate("<<ComponentChanged>>") 
     self.after(1000, self.maybe_change) 


class App(object): 
    def __init__(self): 
     self.root = tk.Tk() 
     self.component = Component(self.root, width=300, height=50) 
     self.label = tk.Label(self.root, text="") 

     self.component.pack(side="top", fill="both", expand=True) 
     self.label.pack(side="bottom", fill="x") 

     self.component.bind("<<ComponentChanged>>", 
          self.handle_component_change) 

    def handle_component_change(self, event): 
     self.label.configure(text="component value is now '%s'" % self.component.value) 

    def start(self): 
     self.root.mainloop() 

app = App() 
app.start() 
関連する問題