<p>你在找穿线。
将要运行的事件放到另一个线程中。请参见以下示例:</p>
<pre><code>import thread, time
def myfunc(a1,a2):
while True:
print a1,a2
time.sleep(1)
thread.start_new_thread(myfunc,("test","arg2")
tkroot.mainloop()
</code></pre>
<p>现在有一个函数与Tkinter窗口一起运行,该窗口每秒打印一次参数。</p>
<p>编辑:我不知道为什么会有这么多的反对票。Tkinter在处理线程方面做得很好,我已经多次使用这个技巧,没有问题。请参见以下示例:</p>
<p>下载一个10 MB的文件并将进度记录到Tkinter窗口。</p>
<p>无螺纹:</p>
<pre><code>import urllib2,thread
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.pack(fill=tk.BOTH, expand=1)
canvas = tk.Canvas(self)
self.text = canvas.create_text(18,18,anchor=tk.W,font="Purisa",text="Status: Press start to download...")
but=tk.Button(text="Start",command=self.start)
canvas.create_window((270,18),window=but)
canvas.pack(fill=tk.BOTH, expand=1)
self.canvas=canvas
def start(self):
#thread.start_new_thread(
self.download("http://ipv4.download.thinkbroadband.com/10MB.zip","10mb.zip")
#)
def onEnd(self):
self.canvas.itemconfig(self.text, text="Status: done!")
def download(self,url,file_name):
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)
file_size_dl = 0
block_sz = 1024*50 #50 kb
while True:
buffer = u.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
status = r"[%3.2f%%]" % (file_size_dl * 100. / file_size)
self.canvas.itemconfig(self.text,text="Status: downloading..."+status)
f.close()
self.onEnd()
def main():
root = tk.Tk()
root.resizable(0,0)
ex = Example(root)
root.geometry("300x70")
root.mainloop()
main()
</code></pre>
<p>窗口将冻结,直到下载完成。</p>
<p>带螺纹:</p>
<pre><code>import urllib2,thread
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.pack(fill=tk.BOTH, expand=1)
canvas = tk.Canvas(self)
self.text = canvas.create_text(18,18,anchor=tk.W,font="Purisa",text="Status: Press start to download...")
but=tk.Button(text="Start",command=self.start)
canvas.create_window((270,18),window=but)
canvas.pack(fill=tk.BOTH, expand=1)
self.canvas=canvas
def start(self):
thread.start_new_thread(
self.download("http://ipv4.download.thinkbroadband.com/10MB.zip","10mb.zip")
)
def onEnd(self):
self.canvas.itemconfig(self.text, text="Status: done!")
def download(self,url,file_name):
u = urllib2.urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (file_name, file_size)
file_size_dl = 0
block_sz = 1024*50 #50 kb
while True:
buffer = u.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
status = r"[%3.2f%%]" % (file_size_dl * 100. / file_size)
self.canvas.itemconfig(self.text,text="Status: downloading..."+status)
f.close()
self.onEnd()
def main():
root = tk.Tk()
root.resizable(0,0)
ex = Example(root)
root.geometry("300x70")
root.mainloop()
main()
</code></pre>
<p>不会冻结,文本会正常更新。</p>