为什么在 .mainloop() 之前启动一个新线程会导致 .mainloop() 不 运行?
Why does starting a new thread before .mainloop() cause .mainloop() to not run?
我正在尝试测试让一个 class 生成数据并让该数据从另一个 class 动态更新列表变量,然后通过在一定时间间隔后更新它们来绘制列表。我只是测试了绘图,这似乎也没有用,但首先我想弄清楚为什么启动一个新线程会阻止 tkinter 的事件循环来自 运行。感谢您的帮助!
import tkinter as tk
import time
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
from matplotlib import animation
import threading
root = tk.Tk()
class dynamicChart():
def __init__(self):
self.x = []
self.y = []
self.buildChart()
def buildChart(self):
self.figure = Figure(figsize=(5, 5), dpi=100)
ax = self.figure.add_subplot(111)
self.scatter = ax.scatter(self.x,self.y)
canvas = FigureCanvasTkAgg(self.figure, root)
canvas.draw()
canvas.get_tk_widget().pack(pady=10)
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack()
def animate(self,i):
self.scatter.set_offsets([self.x, self.y])
def Ani(self):
self.animation = animation.FuncAnimation(self.figure, self.animate, frames = 100, interval = 2000)
class genData():
def __init__(self):
self.chart = dynamicChart()
def generate(self):
X = 1
Y = 0
i = 0
while True:
time.sleep(1)
X = X*i
Y = Y + i
self.chart.x.append(X)
self.chart.y.append(Y)
i+=1
StartDataGen_CreateFigureAxes = genData()
genData = threading.Thread(target = StartDataGen_CreateFigureAxes.generate())
genData.start()
button = tk.Button(root, text="Graph It", command = StartDataGen_CreateFigureAxes.chart.Ani)
button.pack()
root.mainloop()
Why does starting a new thread before .mainloop() cause .mainloop() to not run?
简短的回答是“因为您没有启动新线程”。
考虑这段代码:
genData = threading.Thread(target = StartDataGen_CreateFigureAxes.generate())
它在功能上等同于此代码:
result = StartDataGen_CreateFigureAxes.generate()
genData = threading.Thread(target = result)
看到问题了吗? target
需要提供对可调用对象的引用。
genData = threading.Thread(target = StartDataGen_CreateFigureAxes.generate)
我正在尝试测试让一个 class 生成数据并让该数据从另一个 class 动态更新列表变量,然后通过在一定时间间隔后更新它们来绘制列表。我只是测试了绘图,这似乎也没有用,但首先我想弄清楚为什么启动一个新线程会阻止 tkinter 的事件循环来自 运行。感谢您的帮助!
import tkinter as tk
import time
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
from matplotlib import animation
import threading
root = tk.Tk()
class dynamicChart():
def __init__(self):
self.x = []
self.y = []
self.buildChart()
def buildChart(self):
self.figure = Figure(figsize=(5, 5), dpi=100)
ax = self.figure.add_subplot(111)
self.scatter = ax.scatter(self.x,self.y)
canvas = FigureCanvasTkAgg(self.figure, root)
canvas.draw()
canvas.get_tk_widget().pack(pady=10)
toolbar = NavigationToolbar2Tk(canvas, root)
toolbar.update()
canvas.get_tk_widget().pack()
def animate(self,i):
self.scatter.set_offsets([self.x, self.y])
def Ani(self):
self.animation = animation.FuncAnimation(self.figure, self.animate, frames = 100, interval = 2000)
class genData():
def __init__(self):
self.chart = dynamicChart()
def generate(self):
X = 1
Y = 0
i = 0
while True:
time.sleep(1)
X = X*i
Y = Y + i
self.chart.x.append(X)
self.chart.y.append(Y)
i+=1
StartDataGen_CreateFigureAxes = genData()
genData = threading.Thread(target = StartDataGen_CreateFigureAxes.generate())
genData.start()
button = tk.Button(root, text="Graph It", command = StartDataGen_CreateFigureAxes.chart.Ani)
button.pack()
root.mainloop()
Why does starting a new thread before .mainloop() cause .mainloop() to not run?
简短的回答是“因为您没有启动新线程”。
考虑这段代码:
genData = threading.Thread(target = StartDataGen_CreateFigureAxes.generate())
它在功能上等同于此代码:
result = StartDataGen_CreateFigureAxes.generate()
genData = threading.Thread(target = result)
看到问题了吗? target
需要提供对可调用对象的引用。
genData = threading.Thread(target = StartDataGen_CreateFigureAxes.generate)