我正在开发一个 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()
按“情节!” 一旦生成情节和NavigationToolbar
. 第二次按下它会重新绘制,但会生成第二次 NavigationToolbar
(每次按下“Plot!”时都会生成第二次)。这听起来像是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
然后当“Plot!”时NavigationToolbar
确实消失了 第二次按下(但正如预期的那样,没有新NavigationToolbar
的来代替旧的)。grid_forget()
工作也是如此,只是不像预期的那样。
我究竟做错了什么?有没有更好的更新方法NavigationToolbar
?
非常感谢任何帮助!拉斯塔尔达
编辑:
我发现如果您销毁 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()
.