我正在开发 Tkinter-GUI,根据用户输入以交互方式生成 Matplotlib 绘图。为此,需要在用户更改输入后重新绘制。
我已经让它原则上工作,但想包括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()
按“情节!”once生成绘图和NavigationToolbar
。
第二次按下它会重新绘制,但会生成second 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
to
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
does当“阴谋!”时消失第二次按下(但随后,正如预期的那样,没有新的NavigationToolbar
来替换旧的)。所以grid_forget()
is工作,只是没有达到预期。
我究竟做错了什么?有没有更好的更新方法NavigationToolbar
?
非常感谢任何帮助!
拉斯塔尔达
Edit:
我发现如果您销毁导航工具栏而不是忘记它,这将起作用。但当然,之后您必须再次完全重新创建小部件:
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
然而,下面汉斯展示的更新方法要好得多,因为您不必销毁并重新创建任何东西。我只是想强调我的方法的问题(除了不优雅和性能)可能是我没有使用destroy()
.