我将 matplotlib 与 tkinter 一起使用,我希望图形屏幕/画布/绘图位于 tkinter 窗口内部,所以我将 matplotlib 窗口制作成 tkinter 内部的小部件:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
window = tk.Tk()
fig, ax = plt.subplots()
frame = tk.Frame(window)
frame.pack()
label = tk.Label(window,text="test")
label.pack()
canvas = FigureCanvasTkAgg(fig, master=frame)
canvas.get_tk_widget().pack()
def draw():
ax.hist([1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5],5)
canvas.draw()
canvas.get_tk_widget().destroy()
window.mainloop()
但是现在,当窗口关闭时,python 终端继续运行,如果没有打开控制台选项卡,则无法关闭。 我在网上查看了这个问题,据说我必须在最后重复 plt.show() 两次才能使 matplotlib 关闭但是因为我没有使用 plt.show() 方法来显示图形,所以是不可能关闭的。请帮我解决这个问题
正如您所说,
plt.show()
在这种情况下不起作用,因为您将 Matplotlib 图嵌入到 Tkinter 窗口中。要正确处理关闭窗口的问题,您可以使用 Tkinter 窗口的 destroy() 方法在窗口关闭时正确进行清理。这是修改后的代码:
import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
def draw():
ax.hist([1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5], 5)
canvas.draw()
def on_closing():
window.destroy()
plt.close() # Close the Matplotlib plot
window = tk.Tk()
window.protocol("WM_DELETE_WINDOW", on_closing) # Handle window closing event
fig, ax = plt.subplots()
canvas_frame = tk.Frame(window)
canvas_frame.pack()
canvas = FigureCanvasTkAgg(fig, master=canvas_frame)
canvas.draw()
canvas.get_tk_widget().pack()
draw_button = tk.Button(window, text="Draw", command=draw)
draw_button.pack()
window.mainloop()