Python 为什么在我移动Tkinter GUI时工作线程会冻结?

Python 为什么在我移动Tkinter GUI时工作线程会冻结?,python,multithreading,python-3.x,tkinter,freeze,Python,Multithreading,Python 3.x,Tkinter,Freeze,我在Python3.3中有一个Tkinter GUI,带有一个进度条和一个启动另一个线程的按钮。此线程在10秒内填充进度条,并在此期间在控制台上打印0到99之间的数字。 只要我不移动或调整GUI窗口的大小,它就可以正常工作。如果我删除标记行progress.step(1),这样工作线程就不会接触进度条,因此根本不会影响GUI,即使我正在操作窗口,它也会在控制台上连续打印数字 #!/usr/bin/env python3 # -*- coding: utf-8 -*- from tkinter

我在Python3.3中有一个Tkinter GUI,带有一个进度条和一个启动另一个线程的按钮。此线程在10秒内填充进度条,并在此期间在控制台上打印0到99之间的数字。
只要我不移动或调整GUI窗口的大小,它就可以正常工作。如果我删除标记行
progress.step(1)
,这样工作线程就不会接触进度条,因此根本不会影响GUI,即使我正在操作窗口,它也会在控制台上连续打印数字

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import *
import tkinter.ttk as ttk
import _thread
import time

root = Tk()

def start():
    _thread.start_new_thread(thread, ())

def thread():
    for i in range(0, 100):
        time.sleep(0.1)
        progress.step(1)     #<-----
        print(i)

progress = ttk.Progressbar()
progress.pack()
button = Button(root, text="Start", command=start)
button.pack()

root.mainloop()
#/usr/bin/env蟒蛇3
#-*-编码:utf-8-*-
从tkinter进口*
将tkinter.ttk导入为ttk
导入线程
导入时间
root=Tk()
def start():
_线程。启动新线程(线程,())
def thread():
对于范围(0,100)内的i:
睡眠时间(0.1)

进度。步骤(1)#IIRC,则这取决于窗口管理器。当您移动/调整窗口大小时,有些人会锁定窗口(以及所有子窗口,包括进度条)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from tkinter import *
import tkinter.ttk as ttk
import _thread
import time

root = Tk()

def start():
    _thread.start_new_thread(thread, ())

def thread():
    for i in range(0, 100):
        time.sleep(0.1)
        progress.step(1)     #<-----
        print(i)

progress = ttk.Progressbar()
progress.pack()
button = Button(root, text="Start", command=start)
button.pack()

root.mainloop()
KDE等较新的窗口管理器允许程序在操作窗口时继续渲染到其窗口中

[EDIT]大多数UI框架都不是线程安全的。Python使用的UI框架有时是免税的,因为Python具有GIL,它确保只有一个线程会更改全局状态(即widget属性)

如何在Tkinter中使用多线程有几个相关问题:


简而言之,您不应该在线程中执行任何与UI相关的工作。相反,将事件发送到
mainloop

它在Linux Mint 16上正常工作。您正在使用哪个窗口管理器?为什么使用
\u线程。启动\u新线程()
?改用
threading.Thread
。tkinter不能从创建小部件的线程以外的任何线程调用小部件方法。这可能行,但可能不行。因此,对于Windows7+Python+Tkinter,我别无选择,只能处理这个令人不快的问题。谢谢你的帮助!(我试着穿线。马上穿线)啊,该死的。我正在使用Windows7。。。所以我想我必须在这个操作系统上处理Python+Tkinter的问题?这似乎很奇怪,因为Windows确实能够在操作GUI时渲染东西并在后台工作。如果我在屏幕上移动WMP,音乐不会停止。您知道这个错误是否也发生在其他GUI库中吗?(顺便说一句,我知道WMP不是用Python写的!;-):-/我同意它原则上应该在Windows上工作。我的代码是否打破了Python程序员的惯例?有什么我想不出来的吗?你能用不同的方式编码吗?(我自己也不是最有经验的程序员。)我只是设法将GUI放入一个从属线程本身,但这并没有改变任何事情。