from __future__ import print_function import Tkinter as tkinter import random import string import sys import threading import time running = True class EventThread(threading.Thread): def __init__(self, target): threading.Thread.__init__(self) self.target = target def run(self): while running: time.sleep(0.02) c = random.choice(string.ascii_letters) self.target.event_generate(c) class ExtraTksThread(threading.Thread): def __init__(self, threaded): threading.Thread.__init__(self) self.threaded = threaded def run(self): while running: tk = tkinter.Tk() if self.threaded: tk.update() tk.update_idletasks() tk.destroy() del tk time.sleep(0.02) class Main(object): def __init__(self): self.root = tkinter.Tk() self.tcl_threaded = bool(self.root.tk.call("array","get","tcl_platform","threaded")) self.root.bind('', dummy_handler) self.threads = [] self.t_cleanup = threading.Thread(target=self.tf_stop) def go(self): self.root.after(0, self.add_threads) self.root.after(500, self.stop) self.root.protocol("WM_DELETE_WINDOW", self.stop) self.root.mainloop() self.t_cleanup.join() def stop(self): self.t_cleanup.start() def tf_stop(self): global running running = False for t in self.threads: t.join() self.root.after(0, self.root.destroy) def add_threads(self): for _ in range(20): t = EventThread(self.root) self.threads.append(t) t.start() for _ in range(2): t = ExtraTksThread(self.tcl_threaded) self.threads.append(t) t.start() def dummy_handler(event): pass if __name__ == '__main__': Main().go()