【问题标题】:popup windows with matplotlib figure in tkintertkinter 中带有 matplotlib 图的弹出窗口
【发布时间】:2019-07-28 05:58:04
【问题描述】:

当我在我的 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方法的后半部分,看来问题出在这部分。

self.f=Figure(figsize=(5,5),dpi=100)
self.fig, self.ax= plt.subplots()

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

但是,我对面向对象编程和 tkinter 还很陌生,因此没有足够的经验来弄清楚错误是什么。有什么想法吗?

【问题讨论】:

    标签: python matplotlib tkinter


    【解决方案1】:

    您正在创建两个人物。其中之一是通过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 生成图形的,那怎么可能呢?
    • 如果您查看我的回答中的代码,您会发现在任何地方都看不到 pyplot - 这就是我所说的“删除 pyplot”,即不要用它。至于另一个数字,它可能是以前在相同内核中运行的代码的剩余部分?您是否尝试过完全关闭控制台或 Spyder?
    • 重启内核有效。非常感谢!我不明白为什么不应该在 GUI 中嵌入 pyplot 图形。在 def init 之后调整了你的两行代码,代码似乎运行良好。即使在您的回答中,pyplot 仍然通过“图”存在。 pyplot 和 GUI 不应该混合使用是否有一些根本原因?
    • 哦,抱歉,我没注意那行。它当然应该是from matplotlib.figure import Figure。我编辑了答案。拥有自定义 GUI 时不使用 pyplot 的原因是,您将拥有 pyplot 以及试图管理图形的自定义 GUI。最终哪一个会成功并没有先验的清楚,因此您最终可能会得到一个经常有效但有时无效的代码。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2013-08-26
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多