Я хочу отображать график, который обновляется каждую секунду (наряду с другими вещами) в окне Tkinter.Мне просто нужно получить строку из матрицы данных и построить ее, затем перейти к следующей строке и т. Д.
Поскольку мне нужна кнопка Пуск / Стоп, я использую threading
.
Для этого я следовал этому посту , который в основном делает то, что мне нужно.
Однако через некоторое время Python падает, и Spyder отображает эту ошибку:
An error occurred while starting the kernel
Tcl_AsyncDelete: async handler deleted by the wrong thread
Я пытался прочитать об этом, но я не нашел решения или объяснения этому.
Вот пример кода:
import tkinter as tk
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import time
import threading
continuePlotting = False
line = 0
data = np.random.rand(100, 500)
def change_state():
global continuePlotting
if continuePlotting == True:
continuePlotting = False
else:
continuePlotting = True
def data_points():
global line
global data
l = line % len(data) - 1
r = data[l]
line = line+1
return r
def app():
root = tk.Tk()
root.configure(background='white')
# First Plot
top = tk.Frame(root)
top.pack(fill='both')
fig = Figure()
ax = fig.add_subplot(111)
graph = FigureCanvasTkAgg(fig, master=top)
graph.get_tk_widget().pack(fill='both')
def plotter():
while continuePlotting:
ax.cla()
dpts = data_points()
y = dpts[0:-1]
x = np.linspace(0,len(y),len(y))
ax.plot(x, y)
ax.grid(True)
graph.draw()
time.sleep(1)
def gui_handler():
change_state()
threading.Thread(target=plotter).start()
b = tk.Button(root, text="Start/Stop", command=gui_handler, bg="red", fg="white")
b.pack()
root.mainloop()
if __name__ == '__main__':
app()
Любая помощь будетвысоко ценится