python - 如何让 tkinter 等待新线程完成?

标签 python tkinter

如何让 tkinter 在函数 fix() 中执行,直到 label's 文本被更改,然后打印 end

当前工作:当我单击 sub 按钮时,将创建新线程并执行 for 循环。 10000000 次循环后,我的标签将变为 9999999。但在我的标签更改之前,tkinter 会打印 end

我尝试了 t.join(),但它卡住了 GUI。

import tkinter as tk
from tkinter import ttk
import threading

root = tk.Tk()
label = tk.Label(text='vinoth')
label.pack()

def fix():
    a=0
    t = threading.Thread(target=count, args=(a,))
    t.start()
    #t.join()
    print('end')

def count(a):
        for i in range(0,10000000):
            a=i
        label['text'] = a

button = tk.Button(text='sub', command=fix)
button.pack()
dropdown = ttk.Combobox()
dropdown.pack()

root.mainloop()

最佳答案

您必须小心处理多线程 tkinter 应用程序,因为 tcl/tk 的接口(interface)不支持它。这意味着只有主线程可以调用 tkinter 及其小部件。

也就是说,您可以使用通用 after() 来解决此限制。方法来安排函数定期运行并与线程通信,或者通过线程安全机制,如 Queue或者通过全局变量加上 Lock控制对它或它们的并发访问。

这是一个使用后者来完成您想要完成的任务的示例:

import tkinter as tk
from tkinter import ttk
import threading


POLLING_DELAY = 250  # ms
lock = threading.Lock()  # Lock for shared resources.
finished = False

root = tk.Tk()
label = tk.Label(text='vinoth')
label.pack()

def fix():
    global finished

    with lock:
        finished = False
    t = threading.Thread(target=count)
    t.daemon = True
    root.after(POLLING_DELAY, check_status)  # Start polling.
    t.start()

def check_status():
    with lock:
        if not finished:
            root.after(POLLING_DELAY, check_status)  # Keep polling.
        else:
            print('end')

def count():
    global finished

    for i in range(10000000):
        a = i
    with lock:
        finished = True
        label['text'] = a


button = tk.Button(text='sub', command=fix)
button.pack()
dropdown = ttk.Combobox()
dropdown.pack()

root.mainloop()

关于python - 如何让 tkinter 等待新线程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56008300/

相关文章:

python - 如何在 Python 中将元组中一项的值分配给另一项?

python - 如何自省(introspection) django 模型字段?

python - 使用 tkinter 的简单动画

python - 为什么我的 Button 的命令在创建 Button 时立即执行,而不是在单击时执行?

python - 使用Tkinter时,错误: TclError: image "pyimage8" doesn't exist

python - Tkinter 文本 : Setting tab spaces not working

python - 为什么可以遍历字符串?

python - 在 Pygame 中将一条线作为 Sprite 并具有自己的碰撞

python - (实例化一组按钮,但只有一个有效

python - Python 生成器中的奇怪错误