python+Tkinter+多線程的實(shí)例
python+Tkinter+多線程
界面和多線程一向是編程里比較難的地方,常見的做法一般是界面一個(gè)線程,后臺(tái)新開一個(gè)工作線程,這兩個(gè)線程進(jìn)行通信,這樣可以讓界面不至于為響應(yīng)。
在python中可以利用隊(duì)列完成整體的架構(gòu)設(shè)計(jì)。
直接給大家看代碼吧,一個(gè)簡(jiǎn)單實(shí)例,非常好的例子。
import Tkinter,time,threading,random,Queue
class GuiPart():
def __init__(self,master,queue,endCommand):
self.queue=queue
Tkinter.Button(master,text='Done',command=endCommand).pack()
def processIncoming(self):
while self.queue.qsize():
try:
msg=self.queue.get(0)
print msg
except Queue.Empty:
pass
class ThreadedClient():
def __init__(self,master):
self.master=master
self.queue=Queue.Queue()
self.gui=GuiPart(master,self.queue,self.endApplication)
self.running=True
self.thread1=threading.Thread(target=self.workerThread1)
self.thread1.start()
self.periodicCall()
def periodicCall(self):
self.master.after(200,self.periodicCall)
self.gui.processIncoming()
if not self.running:
self.master.destroy()
def workerThread1(self):
#self.ott=Tkinter.Tk()
#self.ott.mainloop()
while self.running:
time.sleep(rand.random()*1.5)
msg=rand.random()
self.queue.put(msg)
def endApplication(self):
self.running=False
rand=random.Random()
root=Tkinter.Tk()
client=ThreadedClient(root)
root.mainloop()tkinter與多線程問(wèn)題
長(zhǎng)時(shí)間執(zhí)行后臺(tái)任務(wù),UI會(huì)處于無(wú)響應(yīng)狀態(tài)。在子線程里更新UI狀態(tài),聽說(shuō)是不允許的。在哪個(gè)線程里調(diào)用了tk.mainloop(),就只能在哪個(gè)線程里更新UI。
下例演示了如何更新。
import Tkinter as tk
from ttk import *
import time
import Queue, threading
class MainWindow:
def __init__(self):
self.root = tk.Tk()
self.root.title('Demo')
def show(self):
self.progress = tk.IntVar()
self.progress_max = 100
self.progressbar = Progressbar(self.root, mode='determinate', orient=tk.HORIZONTAL, variable=self.progress, maximum=self.progress_max)
self.progressbar.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
self.progress.set(0)
btn = tk.Button(self.root, text='start', command=self.start)
btn.pack(fill=tk.BOTH, expand=True, padx=15, pady=5)
self.btn = btn
self.root.mainloop()
def start(self):
self.progress.set(0)
self.btn.config(state=tk.DISABLED)
self.thread_queue = Queue.Queue() # used to communicate between main thread (UI) and worker thread
new_thread = threading.Thread(target=self.run_loop, kwargs={'param1':100, 'param2':20})
new_thread.start()
# schedule a time-task to check UI
# it's in main thread, because it's called by self.root
self.root.after(100, self.listen_for_result)
def run_loop(self, param1, param2):
progress = 0
for entry in range(self.progress_max):
time.sleep(0.1)
progress = progress + 1
self.thread_queue.put(progress)
def listen_for_result(self):
'''
Check if there is something in the queue.
Must be invoked by self.root to be sure it's running in main thread
'''
try:
progress = self.thread_queue.get(False)
self.progress.set(progress)
except Queue.Empty: # must exist to avoid trace-back
pass
finally:
if self.progress.get() < self.progressbar['maximum']:
self.root.after(100, self.listen_for_result)
else:
self.btn.config(state=tk.NORMAL)
if __name__ == '__main__':
win = MainWindow()
win.show()一個(gè)進(jìn)度條。設(shè)定最大進(jìn)度為100。在子線程里每隔0.1秒更新一格。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python輸出\u編碼將其轉(zhuǎn)換成中文的實(shí)例
今天小編就為大家分享一篇Python輸出\u編碼將其轉(zhuǎn)換成中文的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python利用sched模塊實(shí)現(xiàn)定時(shí)任務(wù)
今天我們來(lái)介紹一下Python當(dāng)中的定時(shí)任務(wù),主要用到的模塊是sched,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-04-04
python使用matplotlib:subplot繪制多個(gè)子圖的示例
這篇文章主要介紹了python使用matplotlib:subplot繪制多個(gè)子圖的示例,幫助大家更好的利用python繪制圖像,感興趣的朋友可以了解下2020-09-09
Python實(shí)現(xiàn)遺傳算法(虛擬機(jī)中運(yùn)行)
遺傳算法(GA)是最早由美國(guó)Holland教授提出的一種基于自然界的“適者生存,優(yōu)勝劣汰”基本法則的智能搜索算法。本文主要介紹了如何通過(guò)Python實(shí)現(xiàn)遺傳算法,感興趣的同學(xué)可以看一看2021-11-11
python實(shí)現(xiàn)最大優(yōu)先隊(duì)列
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)最大優(yōu)先隊(duì)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
解決Scrapy安裝錯(cuò)誤:Microsoft Visual C++ 14.0 is required...
下面小編就為大家?guī)?lái)一篇解決Scrapy安裝錯(cuò)誤:Microsoft Visual C++ 14.0 is required...的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
深入理解Python變量的數(shù)據(jù)類型和存儲(chǔ)
這篇文章主要介紹了Python變量的數(shù)據(jù)類型和存儲(chǔ),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Python模塊學(xué)習(xí) re 正則表達(dá)式
今天學(xué)習(xí)了Python中有關(guān)正則表達(dá)式的知識(shí)。關(guān)于正則表達(dá)式的語(yǔ)法,不作過(guò)多解釋,網(wǎng)上有許多學(xué)習(xí)的資料。這里主要介紹Python中常用的正則表達(dá)式處理函數(shù)2011-05-05

