我正在使用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