使用tkinter创建带有matplotlib图形的弹出窗口

3
当我在tkinter窗口中插入matplotlib图形时,启动程序后会出现额外的弹出窗口。它们不影响GUI的功能,但有点烦人。 我编写了一个简单的脚本来展示这个问题。我通过Spyder运行它:
import tkinter as tk
import matplotlib
matplotlib.use("TkAgg")

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.pyplot import figure as Figure
from matplotlib import pyplot as plt

class MyGUI(tk.Tk):
    def __init__(self,master):
        self.f=Figure(figsize=(5,5),dpi=100)
        self.fig, self.ax= plt.subplots()

        self.canvas = FigureCanvasTkAgg(self.fig,master)


        self.toolbar=NavigationToolbar2Tk(self.canvas,master)
        #self.toolbar.update()
        self.canvas._tkcanvas.pack(padx=20, pady=20)

root =tk.Tk()
window=MyGUI(root)
root.mainloop()

当我运行这个程序时,会弹出三个窗口。其中一个是根窗口,显示一个空的图和一个工具栏(标记为“tk”)。这是唯一我想要的窗口。然后我得到一个带有工具栏的“图1”窗口和一个带有图形和工具栏的“图2”窗口。从注释掉init方法的后半部分来看,问题似乎来自于这部分代码。
图片链接: My output when I run the demo code
self.f=Figure(figsize=(5,5),dpi=100)
self.fig, self.ax= plt.subplots()

self.canvas = FigureCanvasTkAgg(self.fig,master)

然而,我对面向对象编程和tkinter非常陌生,因此没有足够的经验来找出错误所在。有什么想法吗?

1个回答

3
您正在创建两个图形。其中一个是通过pyplot创建的。不应尝试在自定义GUI中嵌入pyplot图形。完全删除pyplot并仅创建一个单独的图形。
import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure

class MyGUI(tk.Tk):
    def __init__(self,master):
        self.fig=Figure(figsize=(5,5),dpi=100)
        self.ax = self.fig.add_subplot(111)

        self.canvas = FigureCanvasTkAgg(self.fig,master)

        self.toolbar=NavigationToolbar2Tk(self.canvas,master)
        #self.toolbar.update()
        self.canvas._tkcanvas.pack(padx=20, pady=20)

root =tk.Tk()
window=MyGUI(root)
root.mainloop()

运行您的代码可以消除一个弹出窗口,但另一个仍然存在。我也不确定您所说的“完全删除pyplot并创建一个单独的图形”是什么意思。我是通过pyplot生成图形的,那怎么可能呢? - NAP_time
如果您查看我的答案中的代码,您会发现根本没有pyplot - 这就是我所说的“删除pyplot”的意思,即不要使用它。至于另一个图形,可能是之前在同一内核中运行的代码的剩余部分吗?您尝试关闭控制台或完全退出Spyder了吗? - ImportanceOfBeingErnest
重启内核起作用了。非常感谢! 我不明白为什么不能在GUI中嵌入pyplot图形。在def __init__之后调整了你的两行代码后,代码似乎运行良好。即使在你的答案中,pyplot仍然通过“Figure”存在。 是否有一些根本性的原因,使得pyplot和GUI不能混合使用? - NAP_time
哦,抱歉,我没有注意到那一行。它当然应该是 from matplotlib.figure import Figure。我已经编辑了答案。在拥有自定义GUI时不使用pyplot的原因是你会同时有pyplot和自定义GUI试图管理图形。不清楚哪一个最终会成功,所以你可能最终得到的代码通常可以工作,但有时却不能。 - ImportanceOfBeingErnest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接