Форум сайта python.su
Добрый день!
Только начал осваивать tkinter, сразу возникло желание прикрутить гуи к своему старому мультитредовому скрипту.
Скопипастил с инета основу, подправил под свой тестовый пример - обработчики из фоновых тредов кидают в основной какие-то месседжи (пока простейшие, только вывод текстовой строки в поле).
Прошу глянуть на скрипт, и подумать - эта система вообще жизнеспособна? Стоит дальше писать или сразу идти искать в инете варианты решения попроще, покрасивше, или поэффективнее?
п.с. в трединге я тоже практически нуб, так что можно критиковать и эту часть. Она недописана, не полностью thread-safe, но возможно сама основа уже неправильна.
Скрипт писался/запускался на п1итоне 3.2
from tkinter import * import threading import logging import time import random import queue from logging import debug,info,warning class GuiThreaded: def __init__(self,master,queue,endCommand): debug("GuiThreaded init") self.queue = queue console = Button(master,text="Done",command=endCommand) self.text = Text() self.scrollbar = Scrollbar(root, command=self.text.yview) self.text.configure(yscrollcommand=self.scrollbar.set) self.scrollbar.pack(side=RIGHT,fill=Y) self.text.pack() console.pack() self.n = 1 def processIncoming(self): debug("processIncoming started") while self.queue.qsize(): try: msg = "%06d : %d : %s" % (self.n,self.scrollbar.get()[1],self.queue.get()) + "\n" self.text.configure(state=NORMAL) self.text.insert(END,msg) if self.scrollbar.get()[1] == 1: self.text.yview(END) self.text.configure(state=DISABLED) self.n = self.n+1 except queue.Empty: pass class MainGuiThread(threading.Thread): def __init__(self,master): threading.Thread.__init__(self) debug("WorkThread init") self.master=master self.queue=queue.Queue() self.gui = GuiThreaded(master,self.queue,self.endApplication) self.workers = [] self.running=1 self.periodicCall() def periodicCall(self): debug("periodicCall started") self.gui.processIncoming() if not self.running: for worker in self.workers: worker.join() debug("One thread finished") self.master.destroy() else: self.master.after(100,self.periodicCall) def endApplication(self): debug("endApplication started") self.running=0 def addWorker(self,number): newthread = threading.Thread(target=self.workerThread, args=(number,)) newthread.start() self.workers.append(newthread) debug("Created new worker %d" % number) def workerThread(self,number): debug("work%d: workerThread started" % number) while self.running: time.sleep(rand.random()*0.3) msg = "work%d : %f" % (number, rand.random()) self.queue.put(msg) debug("work%d: finished" % number) # =========================================================================================== logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s", datefmt="%y-%m-%d %H:%M:%S", filename="myapp.log", filemode="w") root = Tk() rand = random.Random() overseer = MainGuiThread(root) overseer.addWorker(1) overseer.addWorker(2) overseer.addWorker(5) overseer.addWorker(9) root.mainloop() debug("After root mainloop")
Отредактировано Andys (Июль 6, 2012 13:40:11)
Прикреплённый файлы: 1.py (3,0 KБ)
Офлайн
Я чото не понял вопроса ? оно у вас работает или нет ?
Офлайн