【问题标题】:matplotlib graphs not displaying on tkinter windowmatplotlib 图形未显示在 tkinter 窗口上
【发布时间】:2017-10-17 10:16:56
【问题描述】:

当我尝试在 tkinter 窗口中使用 matplotlib 绘制某些东西时,它根本不会出现。如果我删除 tkinter 特定部分,并且只执行基本的 plt.plot(...) 和 plt.show() 它会显示在我的常规文本输出字段中。但是,在这种情况下,我希望它显示在 tkinter 窗口中。我相信它是因为我在 mac (macOS 10.12.4) 上运行它,但是我不知道如何让它显示在 tkinter 窗口中。

import numpy as np
import Tkinter as tk

import matplotlib
matplotlib.use('TkAgg')

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt

root = tk.Tk()

fig = plt.figure(1)
t = np.arange(0.0,3.0,0.01)
s = np.sin(np.pi*t)
plt.plot(t,s)

canvas = FigureCanvasTkAgg(fig, master=root)
plot_widget = canvas.get_tk_widget()

def update():
    s = np.cos(np.pi*t)
    plt.plot(t,s)
    plt.show()

plot_widget.grid(row=0, column=0)
tk.Button(root,text="Update",command=update).grid(row=1, column=0)
root.mainloop()

正如我所说,我相信这是因为我在 MacOS 上运行。仅供参考,当我运行此程序时,会显示一个带有更新按钮的空白 tkinter 窗口,但没有图表。然而,图形确实显示在常规文本输出中,但我希望它在 tkinter 窗口中用于 GUI。请帮忙!

【问题讨论】:

    标签: python-2.7 matplotlib tkinter


    【解决方案1】:

    您需要更新已在 tk 画布中的图形,而不是使用 plt.show() 显示新图形。在这种情况下,只有一个图形打开,因此plt.plot() 将实际工作(尽管在更复杂的情况下它可能会失败)。剩下的就是在绘图后重绘画布,fig.canvas.draw_idle()

    import numpy as np
    import Tkinter as tk
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    import matplotlib.pyplot as plt
    
    root = tk.Tk()
    
    fig = plt.figure(1)
    t = np.arange(0.0,3.0,0.01)
    s = np.sin(np.pi*t)
    plt.plot(t,s)
    
    canvas = FigureCanvasTkAgg(fig, master=root)
    plot_widget = canvas.get_tk_widget()
    
    def update():
        s = np.cos(np.pi*t)
        plt.plot(t,s)
        fig.canvas.draw_idle()
    
    plot_widget.grid(row=0, column=0)
    tk.Button(root,text="Update",command=update).grid(row=1, column=0)
    root.mainloop()
    

    为了将来和保存方面,在将 matplotlib 嵌入 GUI 时尽量避免使用 pyplot。这样可以防止您遇到此处报告的问题。

    import numpy as np
    import Tkinter as tk
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    from matplotlib.figure import Figure
    
    root = tk.Tk()
    
    fig = Figure()
    ax = fig.add_subplot(111)
    t = np.arange(0.0,3.0,0.01)
    s = np.sin(np.pi*t)
    ax.plot(t,s)
    
    canvas = FigureCanvasTkAgg(fig, master=root)
    plot_widget = canvas.get_tk_widget()
    
    def update():
        s = np.cos(np.pi*t)
        ax.plot(t,s)
        fig.canvas.draw_idle()
    
    plot_widget.grid(row=0, column=0)
    tk.Button(root,text="Update",command=update).grid(row=1, column=0)
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多