【问题标题】:How to add an "edit" option to Tkinter Matplotlib navigation toolbar?如何向 Tkinter Matplotlib 导航工具栏添加“编辑”选项?
【发布时间】:2021-08-06 18:06:26
【问题描述】:

使用 matplotlib normally 时,导航工具栏有 8 个选项,包括“编辑轴、曲线和图像参数”选项,此处以蓝色突出显示。

import numpy as np
import matplotlib.pyplot as plt
   
y = [i**2 for i in range(101)]
plt.plot(y)
plt.show()

但是当在tkinter GUI 中绘制时,只有 7 个选项 - 编辑选项是需要的,并且缺少。此外,子情节选项对话框看起来完全不同。

from tkinter import *
import tkinter.ttk as ttk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
fig = plt.Figure(figsize = (5, 5),dpi = 100)
y = [i**2 for i in range(101)]
plot1 = fig.add_subplot(111)
plot1.plot(y)

canvas = FigureCanvasTkAgg(fig,master = root)
canvas.draw()
canvas.get_tk_widget().pack(fill=BOTH, expand=True)

toolbar = NavigationToolbar2Tk(canvas,root)
toolbar.update()
canvas.get_tk_widget().pack(fill=BOTH, expand=True)

root.mainloop()

从这篇帖子here 看来,这似乎与默认选项被 tkinter 库覆盖有关,特别是 NavigationToolbar2Tk 类。有人可以帮助将编辑选项添加回 tkinter 工具栏吗?

非常感谢。

【问题讨论】:

    标签: python matplotlib tkinter toolbar options


    【解决方案1】:

    Matplotlib 可以使用不同的backends 来显示绘图窗口。

    通常它使用PyQt,但您可以使用Tk 运行它

    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.switch_backend('tkagg')
    
    y = [i**2 for i in range(101)]
    plt.plot(y)
    plt.show()
    

    PyQt 使用NavigationToolbar2QT 添加按钮运行功能edit_properties
    但是Tk 使用的NavigationToolbar2Tk 没有这个功能。

    他们还使用不同的代码来创建带有子图选项的窗口。

    同样的问题是当你创建Tkinter 程序时。它必须使用NavigationToolbar2Tk 而没有edit_properties

    您必须创建自己的NavgationToolbar 并添加自己的功能来编辑属性。

    import tkinter as tk  # PEP8: `import *` is not preferred
    import tkinter.ttk as ttk
    import tkinter.messagebox as msg
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
    import matplotlib.pyplot as plt
    
    class MyToolbar(NavigationToolbar2Tk):
        
        def __init__(self, canvas, parent):
            
            self.toolitems = (
                ('Home', 'Lorem ipsum dolor sit amet', 'home', 'home'),
                ('Back', 'consectetuer adipiscing elit', 'back', 'back'),
                ('Forward', 'sed diam nonummy nibh euismod', 'forward', 'forward'),
                (None, None, None, None),
                ('Pan', 'tincidunt ut laoreet', 'move', 'pan'),
                ('Zoom', 'dolore magna aliquam', 'zoom_to_rect', 'zoom'),
    
                # new button in toolbar
                ("Customize", "Edit axis, curve and image parameters", "subplots", "edit_parameters"),                    
    
                (None, None, None, None),
                ('Subplots', 'putamus parum claram', 'subplots', 'configure_subplots'),
                ('Save', 'sollemnes in futurum', 'filesave', 'save_figure'),
                
            )
            super().__init__(canvas, parent)
    
        def edit_parameters(self):
            print("You have to create edit_parameters()")
            msg.showwarning("Warning", "You have to create edit_parameters()")
            
    # --- main ---
    
    y = [i**2 for i in range(101)]
    
    root = tk.Tk()
    
    fig = plt.Figure(figsize=(5, 5), dpi=100)
    plot1 = fig.add_subplot(111)
    plot1.plot(y)
    
    canvas = FigureCanvasTkAgg(fig, master=root)
    canvas.get_tk_widget().pack(fill='both', expand=True)
    #canvas.draw()
    
    #toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar = MyToolbar(canvas, root)  # <-- uses own Toolbar
    #toolbar.update()
    
    root.mainloop()
    

    【讨论】:

    • 感谢 furas 抽出宝贵时间回复。遗憾的是,还没有包含这样一个有用的选项。重新创建“图形选项”弹出窗口超出了我目前的能力,因此我将保持图表静态。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多