【问题标题】:How can I manage the location of the "NavigationToolbar2TkAgg" toolbar?如何管理“NavigationToolbar2TkAgg”工具栏的位置?
【发布时间】:2016-07-07 17:01:42
【问题描述】:

我正在学习如何使用 matplotlib,现在我遇到了问题。当我在“tkinter 项目”中创建一个Figure 并给它一个子图时,我使用NavigationToolbar2TkAgg 创建一个工具栏。此工具栏出现在图表的顶部。如何将其设置为其他位置,例如底部或左侧?

这是代码:

import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

root = tk.Tk()
root.title("I am a newbie!")

# create the figure instances
fig = Figure()
a = fig.add_subplot(122)
b = fig.add_subplot(121)

# figure1 has two subplot and figure 2 has only one
fig2 = Figure(figsize=(2, 2))
c = fig2.add_subplot(111)

# create canvas1
canvas = FigureCanvasTkAgg(fig, root)
canvas.show()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.X)
# put this to the top of the window

# toolbar for canvas1 (figure1)
toolbar = NavigationToolbar2TkAgg(canvas, root)
toolbar.update()

# create canvas2
canvas2 = FigureCanvasTkAgg(fig2, root)
canvas2.show()
canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.X)
# put this to the bottom

# toolbar for canvas2 (figure2)
toolbar2 = NavigationToolbar2TkAgg(canvas2, root)
toolbar2.update()


# this function just to exit
def _quit():
    root.quit()
    root.destroy()


button = tk.Button(master=root, text='Quit', command=_quit)
button.pack(side=tk.BOTTOM)

root.mainloop()

这是出现的窗口:

  • 为什么too​​lbar1的位置在底部?
  • 为什么too​​lbar2在canvas2上面?

我想学习如何设置他们的位置。

【问题讨论】:

  • 不太了解 tkinter,但听起来您可能需要使用图形画布和工具栏创建自己的窗口框架。这样,您可以将工具栏放置在您喜欢的任何位置。然而,这可能需要相当多的工作。
  • 如果您创建 minimal reproducible example 并发布您的代码会有所帮助。
  • @Ajean ,@pathoren 谢谢你的回答,我只是编辑问题,你能看看吗? :)

标签: python matplotlib tkinter toolbar


【解决方案1】:

NavigationToolbar2TkAgg 被实例化时

toolbar = NavigationToolbar2TkAgg(canvas, window)

方法NavigationToolbar2TkAgg._init_toolbar 被调用。它将window 设置为父窗口小部件,并在方法结束时调用self.pack(side=Tk.BOTTOM, fill=Tk.X)。这会影响工具栏在window 中的放置方式。

通过为工具栏创建tk.Frame 小部件,可以更改工具栏的位置。

frame1 = tk.Frame(root)
frame2 = tk.Frame(root)

canvas = FigureCanvasTkAgg(fig, root)
toolbar = NavigationToolbar2TkAgg(canvas, frame1)
canvas2 = FigureCanvasTkAgg(fig2, root)
toolbar2 = NavigationToolbar2TkAgg(canvas2, frame2)

frame1.pack(side=tk.TOP, fill=tk.X)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.X)
frame2.pack(side=tk.TOP, fill=tk.X)
canvas2.get_tk_widget().pack(side=tk.TOP, fill=tk.X)

button = tk.Button(master=root, text='Quit')
button.pack(side=tk.TOP)

由于工具栏现在放置在框架内,因此对第二个工具栏的 pack() 调用不会影响退出按钮。

有问题的方法:github

【讨论】:

  • 谢谢!在您的帮助下,我终于解决了这个问题!还要感谢@pathoren
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多