from __future__ import print_function import tkinter import random import string import sys import threading import time running = True class EventThread(threading.Thread): def __init__(self,target): super(EventThread,self).__init__() self.target = target def run(self): tid = self.ident while running: time.sleep(0.02) c = random.choice(string.ascii_letters) print("%d: sending '%s'"%(tid,c),file=sys.stderr) self.target.event_generate(c) class Main(object): def __init__(self): self.root = tkinter.Tk() self.root.bind('',dummy_handler) self.threads=[] def go(self): self.root.after(20,self.add_threads) self.root.after(5000,self.stop) self.root.mainloop() def stop(self): global running running = False for t in self.threads: t.join() self.root.destroy() def add_threads(self): for _ in range(2): t = EventThread(self.root) self.threads.append(t) t.start() def dummy_handler(event): tid = threading.current_thread().ident print("%d: received: '%s'"%(tid,event.keysym),file=sys.stderr) if __name__ == '__main__': Main().go()