Здравствуйте, я пытаюсь научиться строить график в tkinter. У меня есть программа, которая читает 3 файла с тестовыми данными, а затем должна отображать их на экране. Я создал кнопку, чтобы очистить график в кадре, чтобы я мог использовать его снова, но я продолжаю получать сообщение об ошибке - tkinter.TclError: не может использовать пакет диспетчера геометрии внутри.! Labelframe2, который уже имеет подчиненные устройства, управляемые сеткой Итак, я не понимаю эту ошибку, поскольку не думал, что использую pack, я рисую свой график с помощью сетки - может ли кто-нибудь дать мне какое-то руководство, я включил код и файлы тестовых данных.
##test data files
Blue_Test.csv
Name1,Name2,Name3,Name4,Name5
1,10,19,1000,Blue
2,20,20,1001,Blue
3,30,21,1002,Blue
4,40,24,1005,Blue
5,60,25,1006,Blue
Green_Test.csv
Name1,Name2,Name3,Name4,Name5
1,10,19,1000,Green
2,40,24,1005,Green
3,60,25,1006,Green
4,20,20,1001,Green
5,30,21,1002,Green
Yellow_Test.csv
Name1,Name2,Name3,Name4,Name5
1,10,19,1000,Yellow
2,20,20,1001,Yellow
3,30,21,1002,Yellow
4,40,24,1005,Yellow
5,60,25,1006,Yellow
import tkinter
import numpy as np
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
my_window = tkinter.Tk()
current_list = ['Blue', 'Green', 'Yellow']
window_frame = tkinter.LabelFrame(my_window, height=800, width=600, text='window_frame', labelanchor='n', bd='4')
window_frame.grid(row=0, column=0, padx='10', pady='10')
graph_frame = tkinter.LabelFrame(my_window, height=600, width=600, text='graph_frame', labelanchor='n', bd='4')
graph_frame.grid(row=0, column=0, padx='10', pady='10')
fig = Figure(figsize=(2, 3), dpi=100)
ax = fig.add_subplot(111)
for item in current_list:
x, y = np.loadtxt(item + '_' + 'Test.csv', skiprows=1, usecols=[2, 3],
unpack=True, delimiter=',')
ax.plot(x, y)
canvas = FigureCanvasTkAgg(fig, master=graph_frame) # A tk.DrawingArea
canvas.draw()
canvas.get_tk_widget().grid(row=1, column=0)
toolbar = NavigationToolbar2Tk(canvas, graph_frame)
toolbar.update()
def on_key_press(event):
print("you pressed {}".format(event.key))
key_press_handler(event, canvas, toolbar)
canvas.mpl_connect("key_press_event", on_key_press)
def _quit():
graph_frame.quit() # stops mainloop
graph_frame.destroy() # this is necessary on Windows to prevent
# Fatal Python Error: PyEval_RestoreThread: NULL tstate
button = tkinter.Button(master=window_frame, text="Quit", command=_quit)
button.grid(row=2, column=1)
def _clear():
plt.clf()
# Fatal Python Error: PyEval_RestoreThread: NULL tstate
button = tkinter.Button(master=window_frame, text="Quit", command=_clear)
button.grid(row=2, column=2)
window_frame.mainloop()
# If you put root.destroy() here, it will cause an error if the window is
# closed with the window manager.