2017-07-13 23 views
0

在我的代码中,主窗口正在发出事件信号,这些信号将被子窗口捕获,这将显示标签中的更改。但只有最后一个子窗口捕获事件信号,并更改它的标签。怎么了?Tkinter事件在所有子窗口中都未被触发。

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

调用bind结合以前的所有功能。要绑定额外的功能,你需要使用可选的第三个参数:

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

其实我想要做更新的屏幕响应来自父窗口的信号。使用第三个参数的作品!非常感谢。 –