如何向 Tkinter Matplotlib 导航工具栏添加 "edit" 选项?

How to add an "edit" option to Tkinter Matplotlib navigation toolbar?

使用 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()

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

非常感谢。

Matplotlib 可以使用不同的 backends 来显示 plot window.

通常它使用 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 which adds button to run function edit_properties
但是 Tk 使用 NavigationToolbar2Tk 没有这个功能。

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

同样的问题是当你创建 Tkinter program.It 时必须使用 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()