【问题标题】:How to share data between two threads [duplicate]如何在两个线程之间共享数据[重复]
【发布时间】:2019-07-22 11:16:07
【问题描述】:

我正在使用 Tkinter 创建一个应用程序。我有两个线程,第一个是查找结果的算法,第二个是我的 Tkinter 窗口,它显示找到的结果数。

import time
from tkinter import *
from threading import Thread

global results
results = []

class thread(Thread):
    def __init__(self, name):
        Thread.__init__(self)
        self.name = name

    def run(self):
        global results
        if self.name == "algo":
            algo()
        elif self.name == "window":
            window = Tk()
            tmp = StringVar()
            tmp.set(str(len(results)))
            text = Label(window, textvariable=tmp, font=(None, 12))
            text.place(x=10, y=15)
            window.mainloop()

def algo():
    global results
    while True:
        time.sleep(1)
        results += [1]
        print(len(results))

thread_1 = thread("algo")
thread_2 = thread("window")
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()

问题是文本变量没有更新。

【问题讨论】:

    标签: python-3.x multithreading tkinter


    【解决方案1】:

    您可以在主线程中运行tkintermainloop,并在专门生成的新Thread 中运行您的函数。似乎不需要更多:

    import time
    import tkinter as tk
    from threading import Thread
    
    def algo():
        while True:
            time.sleep(1)
            result.set(result.get() + 1)
            print(result.get())
    
    root = tk.Tk()
    result = tk.IntVar(value=0)
    label = tk.Label(root, textvariable=result)
    label.pack()
    
    thread_1 = Thread(target=algo)
    thread_1.start()
    
    root.mainloop()
    

    【讨论】:

    • global results (实际上是指global result 吗?)不是必需的。设置IntVar 的初始值应为IntVar(value=0),因为IntVar(0) 表示IntVar(master=0)
    • 完全正确@acw1668,谢谢,很好。我编辑了 Op 代码的这些残余。
    猜你喜欢
    • 2013-08-05
    • 2015-09-08
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多