Уведомления

Группа в Telegram: @pythonsu

#1 Июль 6, 2012 13:17:32

Andys
От:
Зарегистрирован: 2010-09-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter + threading

Добрый день!
Только начал осваивать 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)

Прикреплённый файлы:
attachment 1.py (3,0 KБ)

Офлайн

#2 Авг. 9, 2012 10:04:01

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Tkinter + threading

Я чото не понял вопроса ? оно у вас работает или нет ?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version