当 mathplotlib 集成在 tkinter 内部时,程序无法关闭

问题描述 投票:0回答:1

我将 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() 方法来显示图形,所以是不可能关闭的。请帮我解决这个问题

python matplotlib tkinter
1个回答
0
投票

正如您所说,

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()
© www.soinside.com 2019 - 2024. All rights reserved.