python - 通过后台线程访问 Tkinter 的文本小部件会导致崩溃

标签 python multithreading tkinter

我创建了一个简单的 tkinter 应用程序,其中使用了两个线程。他们的任务是将数字写入标签和文本等小部件。第一个线程由按钮(单击事件)触发,第二个线程作为后台线程执行。

import Tkinter as tk
from ttk import *
from Tkconstants import *
import threading, thread, time

def tl1(text,counter):
    while True:
        text.insert(END,counter)
        counter += 1
        time.sleep(2)

def tl2(label,counter):
    while True:
        label['text'] = counter
        counter += 1
        time.sleep(1)

class mainWindow():
    def __init__(self, master):
        self.master = master
        self._initLayout()

    def _initLayout(self):

        #button
        self.button = tk.Button(self.master, text="thread1_start", command = self._task1)
        self.button.pack()

        #label
        self.label = tk.Label(self.master)
        self.label.pack()

        #text
        self.text = tk.Text(self.master, width=30)
        self.text.pack()

    def _task1(self):
        t1 = thread.start_new_thread(tl1,(self.text,1))

    def _task2(self):
        t2 = thread.start_new_thread(tl2,(self.label,1000))

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.mainWindow = mainWindow(self)

        self.mainWindow._task2() #background_thread

app = App()
app.mainloop()

以这种方式,一切工作正常,但如果我们更改后台线程以在文本小部件上显示结果,整个应用程序就会卡住。
为什么后台线程与标签通信可以正常工作,但会导致文本小部件出现问题?有什么办法可以正常运行吗?

最佳答案

Tkinter 不是线程安全的。您只能从创建它们的线程访问小部件。您的线程需要将数据放入线程安全队列中,并且您的 GUI 线程需要轮询该队列。

在您的特定情况下,您根本不需要线程。您可以使用 tkinter after 方法定期运行代码。

关于python - 通过后台线程访问 Tkinter 的文本小部件会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28047746/

相关文章:

python - 将映射函数应用到 ndarray 的每个成员,并以索引作为参数

python - Argparse:制作所需的标志

c# - FIFO 订单中的 TPL 生产者消费者#

java - 在一个方法内同时调用多个服务

python - 讲解Tkinter文本搜索方法

PYTHON:Tkinter.OptionMenu 问题:option menu不执行command函数给用户选择

javascript - 如何在Python中获取JavaScript内容

Python requests_toolbelt MultipartEncoder 文件名

c# - 在系统启动时延迟服务

python - 如何将 Canvas 内容转换为图像?