在所有子窗口中都没有触发Tkinter事件。

时间:2017-07-13 18:05:09

标签: python events tkinter python-multithreading

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

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()

1 个答案:

答案 0 :(得分:1)

调用bind un 绑定所有以前的功能。要绑定其他函数,需要使用可选的第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()

此外,这不是我们通常所说的“孩子”。这只是一个不同的对象。