gpt4 book ai didi

Tkinter 中的 Matplotlib 图 - 每次更新都会添加新的 NavigationToolbar?

转载 作者:行者123 更新时间:2023-12-01 12:50:23 27 4
gpt4 key购买 nike

我正在开发 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。第二次按下它会重新绘制,但会生成一个 second 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

然后 NavigationToolbar 确实在“Plot!”时消失了第二次按下(但正如预期的那样,没有新的 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()

最佳答案

一种略有不同的方法可能是通过清除和重新绘制来将图形重新用于后续绘图。这样,您就不必销毁和重新生成图形和工具栏:

from Tkinter import Tk, Button
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg

# plotting function: clear current, plot & redraw
def plot(x, y):
plt.clf()
plt.plot(x,y)
# just plt.draw() won't do it here, strangely
plt.gcf().canvas.draw()

# just to see the plot change
plotShift = 0
def main():
global plotShift

x = np.arange(0.0,3.0,0.01)
y = np.sin(2*np.pi*x + plotShift)
plot(x, y)

plotShift += 1

# GUI
root = Tk()

draw_button = Button(root, text="Plot!", command = main)
draw_button.grid(row=0, column=0)

# init figure
fig = plt.figure()

canvas = FigureCanvasTkAgg(fig, master=root)
toolbar = NavigationToolbar2TkAgg(canvas, root)
canvas.get_tk_widget().grid(row=0,column=1)
toolbar.grid(row=1,column=1)

root.mainloop()

关于Tkinter 中的 Matplotlib 图 - 每次更新都会添加新的 NavigationToolbar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12930143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com