2017-07-13 8 views
0

私のコードでは、メインウィンドウがイベント信号を放射しています。これは子ウィンドウで捕捉され、ラベルに変更が表示されます。しかし、最後の子ウインドウだけがイベント信号をキャッチし、そのラベルを変更します。どうしましたか?呼び出しbindすべての子ウィンドウでTkinterイベントがtrigredされません。

from Tkinter import * 
from threading import Timer as tt 

class main(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     tt(.5,self.timedsig).start() 
     for i in range (5): 
      child(self,i) 

    def timedsig(self): 
     self.event_generate("<<timedsig>>") 
     tt(.5,self.timedsig).start() 


class child(Toplevel): 
    def __init__(self,master,num): 
     Toplevel.__init__(self) 
     self.title(str(num)) 
     self.num=num 
     self.var=IntVar() 
     self.var.set(0) 
     Label(self,textvariable=self.var).pack() 
     self.master=master 
     self.master.bind("<<timedsig>>",self.changelabel) 

    def changelabel(self,e): 
     print self.num,self.var.get() 
     self.var.set(self.var.get()+1) 


if __name__=="__main__": 
    main().mainloop() 
+0

私はあなたがイベントに単一の関数をバインドできると思うので、特定のイベントの最後のバインドだけが適用されます。 – FamousJameous

答えて

1

国連は、以前のすべての機能をバインドします。追加の機能をバインドするには、オプションの第3引数を使用する必要があります。

self.master.bind("<<timedsig>>",self.changelabel, '+') 

をしかし、あなたは、単にインスタンスに変数を渡すことができるとき、それはあなたのケースで行うにはかなり愚かです:

import Tkinter as tk 

class Main(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.var = tk.IntVar(value=0) 
     for i in range (5): 
      Popup(self, i, self.var) 
     self.timedsig() # start the looping 

    def timedsig(self): 
     self.var.set(self.var.get() + 1) 
     self.after(500, self.timedsig) # call this again in 500 ms 

class Popup(tk.Toplevel): 
    def __init__(self, master, num, var): 
     tk.Toplevel.__init__(self) 
     self.title(str(num)) 
     lbl = tk.Label(self,textvariable=var) 
     lbl.pack() 

if __name__=="__main__": 
    root = Main() 
    root.mainloop() 

もそれは私たちが通常「子供」と呼ぶものではありません。それはちょうど別のオブジェクトです。

+0

実際、私は親ウィンドウからの信号に応答して画面を更新したいと思っていました。第3引数を使用して動作します!どうもありがとう。 –

関連する問題