Tkinter 中的 Matplotlib 绘图 - 每次更新都会添加新的导航工具栏?

2023-11-29

我正在开发 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().


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

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tkinter 中的 Matplotlib 绘图 - 每次更新都会添加新的导航工具栏? 的相关文章

随机推荐

  • 项目的选择器不是另一个项目的后代

    给定下面的 HTML 您将如何选择所有不是 itemcontainer 后代的 name s 类似于 group header name not 源自 itemcontainer 我知道这可以通过 jQuery 或添加其他类很容易地完成 但
  • cv2.getOptimalNewCameraMatrix 在某些数据集上返回 [0,0,0,0] 的 ROI

    我正在使用 OpenCV 2 x 开发一个 Python 程序 下面是我的代码摘录 该代码在已捕获和保存的文件列表上运行 所有图像都是80 x 60 8 位灰度图像 我得到的最好的投资回报率是 1 6 73 49 对于一台相机 但我的另一台
  • 在Java中将base64字符串转换为图像

    我有一个通过 JSON 字符串发送给我的图像 我想在我的 Android 应用程序中将该字符串转换为图像 然后显示该图像 JSON 字符串如下所示 data image png base64 iVBORw0KGgoAAAANSUhEUgAA
  • WinAPI C++ 客户端在读取之前检测匿名管道上的写入

    我正在编写一个 C Windows 客户端控制台应用程序 该应用程序从 STDIN 上的匿名管道读取数据 我希望能够按如下方式使用我的程序 echo input text here my app exe 并在应用程序中使用通过管道输入的文本
  • 为什么我的 JLabel 没有显示

    我正在调用此方法 称为检查我的抽象类之一 但由于某种原因 我添加到 JPanel 面板 的 JLabel 问题 没有显示 为什么会出现这种情况 任何解释 我都使用重绘和验证方法 但仍然没有显示任何内容 您遇到的问题是您阻塞了事件调度线程 阻
  • 了解 Java 中的一个大公司项目 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 理解java大公司项目的最好方法是什么 关于这个主题 有一个不错的播客 采访 Dave Thomas 务实的程序员 Dave here 他称之为 软件考古学 由于许多不同的原因 组织经常失
  • 将强类型属性名称作为参数传递

    我有一个收藏IEnumerable
  • mvc4 中 Global.asax 中的会话超时重定向

    我试图检测会话何时结束 然后在我的全局 asax 文件中完成此操作后将用户重定向到主页 我正在使用我发现的下面的代码here 全局 asax protected void Session Start if Context Session n
  • Razor 页面中 foreach 循环内的表单

    我有一个标准的 Razor 页面 其中列出了我的数据库中的所有订单 它的编码非常标准 IList
  • 是否可以在 THREE.js 中启用无限数量的渲染器?

    为了避免 XY 问题 让我解释一下我来自哪里 我想使用 THREE js 使用同一时间轴绘制大量堆叠在一起的波形 波形只是三线 我通过修改正交相机的视图范围来实现这些波形的缩放 平移 缩放 我最初尝试完成此任务 导致我创建多个具有固定高度的
  • 在 Laravel 5.5 中使用 str_limit 函数限制文本

    我一直在尝试限制我的博客内容文本str limit在我对其应用字符限制之前 它工作得很好 请查看我的刀片文件的代码中缺少什么 str limit blog gt content 在默认限制下工作正常 在视图上显示有限的文本 但是当我应用任何
  • PrimeFaces:验证时的条件更新

    是否可以仅在验证成功时有条件地更新 JSF 组件 我希望能够做类似的事情
  • 为什么我的浮点值无法正确打印?

    我正在尝试打印浮点值 0x40a00000 和 0xc0200000 但是我打印出来的值和根据 IEEE 754 浮点转换器的正确值 https www h schmidt net FloatConverter IEEE754 html 完
  • 如何让 Visual Studio 识别 XAML 更改?

    我刚刚开始使用 WPF 所以这里可能缺少一些简单的东西 我有一个正在 VS 2010 中编辑的窗口 当我手动更改 XAML 然后运行应用程序 F5 时 窗口仍保持编辑之前的状态 但是如果我进行重建然后运行应用程序 我的更改就会显示 有什么方
  • @Component Hibernate 类

    我在程序中休眠了带注释的类 由于我正在运行一个 Spring 项目 我已将它们包含在 servlet xml 文件中 com student dto 是实际的包名称 并在联系人实体上添加了 Component 有没有一种方法可以自动添加 C
  • R 中的捷克语编码

    我在新计算机上安装了 RStudio 并出现了编码问题 当我在控制台中键入带重音的文本 不涉及文件写入或读取 只是普通控制台 时 我丢失了捷克语口音 如本示例所示 请注意带重音的 N 和 gt uf uf ufi ky 1 Nuf nuf
  • C#cefsharp浏览器尝试设置代理[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我不太擅长使用 CefSharp 浏览器 所以我需要一些外部帮助 using System using System Collections Generic using System Co
  • npm @types 包的类型 globalDevDependency 的等价物是什么?

    我想升级一个 电子邮件受保护 项目到 tsc 2 并在流程沟中typings从我的工具链 对于常见的依赖项来说这不是问题 因为这些依赖项来自我的typings json dependencies bluebird registry npm
  • Matlab:打印符号方程

    我有一个符号方程 la 2x 3y 4z 0 问题是我想将其与我正在输入的完整句子一起打印到屏幕上 我希望在终端中显示 整流平面的方程为 2x 3y 4z D 我是 Matlab 新手 无法找到适合于此的函数 谢谢 蛇 您可以使用CHAR符
  • Tkinter 中的 Matplotlib 绘图 - 每次更新都会添加新的导航工具栏?

    我正在开发 Tkinter GUI 根据用户输入以交互方式生成 Matplotlib 绘图 为此 需要在用户更改输入后重新绘制 我已经让它原则上工作 但想包括NavigationToolbar 但是 我似乎无法获得更新NavigationT