這是一個古老的問題,但我指的代碼配方幫助我有一個類似的概念,所以我認爲它應該共享。
這種類型的問題需要使用線程,以便我們完成更新GUI和執行實際任務(例如發送電子郵件)的工作。看看來自Active State的這個code recipe,我相信這正是您尋找的線程間傳遞信息(通過隊列)的例子。
我嘗試突出顯示代碼配方中的重要部分。我不包括設置進度條本身,而是包括整體代碼結構和獲取/設置隊列。
import Tkinter
import threading
import Queue
class GuiPart:
def __init__(self, master, queue, endCommand):
self.queue = queue
# Do GUI set up here (i.e. draw progress bar)
# This guy handles the queue contents
def processIncoming(self):
while self.queue.qsize():
try:
# Get a value (email progress) from the queue
progress = self.queue.get(0)
# Update the progress bar here.
except Queue.Empty:
pass
class ThreadedClient:
# Launches the Gui and does the sending email task
def __init__(self, master):
self.master = master
self.queue = Queue.Queue()
# Set up the Gui, refer to code recipe
self.gui = GuiPart(master, self.queue, ...)
# Set up asynch thread (set flag to tell us we're running)
self.running = 1
self.email_thread = threading.Thread(target = self.send_emails)
self.email_thread.start()
# Start checking the queue
self.periodicCall()
def periodicCall(self):
# Checks contents of queue
self.gui.processIncoming()
# Wait X milliseconds, call this again... (see code recipe)
def send_emails(self): # AKA "worker thread"
while (self.running):
# Send an email
# Calculate the %age of email progress
# Put this value in the queue!
self.queue.put(value)
# Eventually run out of emails to send.
def endApplication(self):
self.running = 0
root = Tkinter.Tk()
client = ThreadedClient(root)
root.mainloop()
我試過用我的代碼,我仍然有同樣的問題。我認爲問題在於,當電子郵件發送時,整個過程「暫停」。也許我需要找到一個更好的方式來做發送部分。 – apatrick 2011-12-24 01:47:05