Gui, Tkinter, Threads, Queue
Verfasst: Mittwoch 26. November 2008, 16:50
Gerade weil es in letzter Zeit mehrere Postings zu diesem Thema gab,
möchte ich das Ganze nochmal aufgreifen.
Das folgende Programm erzeugt eine grössere Anzahl
von Threads und kommuniziert mit der Gui mittels
eines Message-Queues.
Ist es so (und *nur* so) richtig?
yipyip
möchte ich das Ganze nochmal aufgreifen.
Das folgende Programm erzeugt eine grössere Anzahl
von Threads und kommuniziert mit der Gui mittels
eines Message-Queues.
Code: Alles auswählen
#!/usr/bin/env python
####
import Tkinter as tk
import threading
import Queue as qu
import random as rand
import time as ti
import sys
####
class Gui(object):
def __init__(self, root, controller):
self.root = root
self.queue = controller.queue
self.controller = controller
self.text = tk.Text(root)
self.text.pack(expand=tk.YES, fill=tk.BOTH)
root.protocol("WM_DELETE_WINDOW", self.quit)
self.button = tk.Button(text='Stop',
command=self.controller.set_stop)
self.button.pack()
self.button = tk.Button(text='Quit', command=self.quit)
self.button.pack()
def quit(self):
self.controller.set_stop()
self.root.destroy()
sys.exit(0)
def write(self, txt):
self.text.insert(tk.END, txt + '\n')
self.text.see(tk.END)
def process(self):
while self.queue.qsize():
try:
msg = self.queue.get()
self.queue.task_done()
self.write(str(msg))
self.root.update_idletasks()
except qu.Empty:
pass
self.root.after(1, self.process)
####
class Threader(object):
def __init__(self, root, n, sleeptime=0.5):
self.root = root
self.queue = qu.Queue(maxsize=1000)
self.gui = Gui(root, self)
self.set_running()
self.threads = [None] * n
for i in xrange(n):
self.threads[i] = threading.Thread(target=self.worker,
args=(i, sleeptime))
self.threads[i].setDaemon(1)
self.threads[i].start()
self.set_running()
def set_running(self):
self.running = 1
self.gui.process()
def set_stop(self):
self.running = 0
def worker(self, i, sleeptime):
while self.running:
t = rand.random() * sleeptime
ti.sleep(t)
if self.running:
msg = 'thread: %3d - slept: %s - queue size: %s' % \
(i, str(t), self.queue.qsize())
self.queue.put(msg)
self.queue.join()
####
def main_threader():
# zum rumspielen
MAX_THREADS = 380
SLEEPTIME = 0.4
root = tk.Tk()
root.title('Queue Polling')
Threader(root, MAX_THREADS, SLEEPTIME)
root.mainloop()
####
if __name__ == '__main__':
main_threader()
####
yipyip