python-3.x - 如何在两个线程之间共享数据
问题描述
我正在使用 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()
问题是 textvariable 没有更新。
解决方案
您可以tkinter
mainloop
在主线程中运行,并且您的函数在特别生成的 new 中运行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()
推荐阅读
- java - 如果在 for-each-loop 到 Stream
- c# - FluentValidation 在列表中查找重叠的日期时间
- python - Python:将字典中的键转换为可以重复的星期几
- python - 为什么 CNN 的执行量超过了训练规模
- mysql - 使用Node js将未知的csv文件插入mysql db
- c# - EF 中是否有针对 LINQ 表达式的等效语句?
- python - Matplotlib fill_between() 多行
- java - 查找最后一行java 2d Array的平均值
- time-complexity - 有理函数的大θ?
- php - 无法在 Laravel 的表结构中设置外键