2016-04-06 10 views
0

今私はインスタンス変数とクラスの概念を理解しています。私はこれまでに問題があったことは一度もなく、頻繁に使用しています。しかし、私がMainWindowクラスを作ると、インスタンス変数にアクセスしようとするまで、すべてが桃色です。Python Tkinter - メインウィンドウクラスの外側から変数を変更するにはどうすればいいですか?

http://pastebin.com/tDs5EJhiは完全なコードですが、この時点で、それだけで、ラベルやフレームを配置していますし、その他もろもろ、実際のロジックが起こっていません。窓はよく見え、何も悪いことは起こりません。

私の質問は、私は外窓の内側に変更する事をしようとすることになります。私は、通常のように、クラスのインスタンスを作成し、そこから変数を変更することができたと考えましたが(Tkinterはそれについて素敵ではなく、Tkinterのメインループの結果だと思います。 )。

ここで私のクラスのメインウィンドウ(のちらほらだ)私はインスタンス変数を編集する方法を学んだ方法です(207 LN)

  ... 
      self.C4 = Tk.PhotoImage(file="temp.png") 
      self.card4 = self.CardCanvas.create_image(120,46,image=self.C4, state=Tk.NORMAL) 
      #self.CardCanvas.itemconfig(4, state=Tk.HIDDEN) # < It works here 
      ... 
     self.root.mainloop() 

window = MainWindow() 
window.CardCanvas.itemconfig(4, state=Tk.HIDDEN) # < It doesn't work here 

とのトラブルを抱えているという。ウィンドウがポップアップした場合、それはクラス内でそれをしたのと同じようitemconfigコマンドは、実際には適用されません(または多分それはやったとウィンドウがちょうど更新されませんでした?)し、ウィンドウを閉じた後、私はこのエラーを取得:

私は今、ウィンドウが閉じられたことを、もはや存在しない変数にメソッドを適用しようとしているという理由だけであると仮定し
_tkinter.TclError: invalid command name 

私はMainWindowクラスを持っていますが、Tk.mainloop()が実行されているので、クラスの外部から変更することはできません。 itemconfigのように、実行後の他のコード。これらの変数を変更するにはどうすればよいですか?インスタンス変数宣言後のコードは、MainWindow()が閉じられるまで実行されないようです。

答えて

0

あなたはmainloop後のコードが実行されないことが正しいです。ただし、GUIが破棄された後にのみ実行されます。 Tkinterは、mainloopへの呼び出しが実行可能なコードの最後の行(あるいは最後の行)になるように設計されています。いったん呼び出されると、他のすべての作業はイベントへの反応として行われなければなりません。それがGUIプログラミングの本質です。

「変数を変更するにはどうすればいいですか」の答えは簡単です:mainloopに電話するか、イベントに反応して行うのですか?たとえば、ボタンへのコールバックで行うか、イベントにバインドされた関数で行うか、またはafterなどの時間ベースのイベントなどで行います。

+0

私は、「アフター」は、ウィンドウの更新に関して探していると思います。助けてくれてありがとう! – Hexic

関連する問題