我正在使用Tkinter-GUI交互式生成Matplotlib圖,具體取決於用戶輸入。爲此,需要在用戶更改輸入後重新繪製。Tkinter中的Matplotlib圖 - 每次更新都會添加新的NavigationToolbar?
我得到它的工作原理,但想包括NavigationToolbar
。但是,我似乎無法獲得更新的NavigationToolbar
正常工作。
下面是代碼的基本工作版本(無需用戶輸入項):「情節」
# Import modules
from Tkinter import *
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
# global variable: do we already have a plot displayed?
show_plot = False
# plotting function
def plot(x, y):
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax1.plot(x,y)
return fig
def main():
x = np.arange(0.0,3.0,0.01)
y = np.sin(2*np.pi*x)
fig = plot(x, y)
canvas = FigureCanvasTkAgg(fig, master=root)
toolbar = NavigationToolbar2TkAgg(canvas, toolbar_frame)
global show_plot
if show_plot:
#remove existing plot and toolbar widgets
canvas.get_tk_widget().grid_forget()
toolbar_frame.grid_forget()
toolbar_frame.grid(row=1,column=1)
canvas.get_tk_widget().grid(row=0,column=1)
show_plot=True
# GUI
root = Tk()
draw_button = Button(root, text="Plot!", command = main)
draw_button.grid(row=0, column=0)
fig = plt.figure()
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().grid(row=0,column=1)
toolbar_frame = Frame(root)
toolbar_frame.grid(row=1,column=1)
root.mainloop()
按一旦生成圖和NavigationToolbar
。 按它第二次replots,但生成秒NavigationToolbar
(另有每次「情節!」被按下)。這聽起來像grid_forget()
不起作用。 但是,當我改變
if show_plot:
#remove existing plot and toolbar widgets
canvas.get_tk_widget().grid_forget()
toolbar_frame.grid_forget()
toolbar_frame.grid(row=1,column=1)
canvas.get_tk_widget().grid(row=0,column=1)
show_plot=True
到
if show_plot:
#remove existing plot and toolbar widgets
canvas.get_tk_widget().grid_forget()
toolbar_frame.grid_forget()
else:
toolbar_frame.grid(row=1,column=1)
canvas.get_tk_widget().grid(row=0,column=1)
show_plot=True
那麼NavigationToolbar
確實消失時, 「情節!」再次按下(但如預期的那樣,沒有新的NavigationToolbar
替代舊的)。所以grid_forget()
是工作,只是不如預期。
我在做什麼錯?有沒有更好的方法來更新NavigationToolbar
?
任何幫助非常感謝! Lastalda
編輯:
我發現,如果你破壞了NavigationToolbar而不是遺忘它,這將工作。但是,你必須完全執行後再次重建過程中的小部件,:
canvas = FigureCanvasTkAgg(fig, master=root)
toolbar_frame = Frame(root)
global show_plot
if show_plot: # if plot already present, remove plot and destroy NavigationToolbar
canvas.get_tk_widget().grid_forget()
toolbar_frame.destroy()
toolbar_frame = Frame(root)
toolbar = NavigationToolbar2TkAgg(canvas, toolbar_frame)
toolbar_frame.grid(row=21,column=4,columnspan=3)
canvas.get_tk_widget().grid(row=1,column=4,columnspan=3,rowspan=20)
show_plot = True
但是,更新的方式顯示由Hans下面是好得多,因爲你沒有破壞並重新創建任何東西。我只是想強調,我的方法(除了不雅和表現)的問題可能是我沒有使用destroy()
。
謝謝!我曾經在各種渠道看到過對'plt.draw()'的引用,但它並不起作用,這就是爲什麼我採用了銷燬和重新創建的方法。但是,這當然好多了。謝謝! – Lastalda