为什么在 .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)