通过网格在 Tkinter 中显示 Matplotlib 导航工具栏

Posted

技术标签:

【中文标题】通过网格在 Tkinter 中显示 Matplotlib 导航工具栏【英文标题】:Displaying Matplotlib Navigation Toolbar in Tkinter via grid 【发布时间】:2012-10-06 12:04:23 【问题描述】:

我正在开发一个小型 Tkinter GUI 来绘制 matplotlib-plots。 (它包含一些条目并根据其内容组装情节。)

我根据http://matplotlib.org/examples/user_interfaces/embedding_in_tk.html 设计了我的绘图小部件,只是我使用网格而不是包:

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().grid(row=1,column=4,columnspan=3,rowspan=20)

那部分有效。但是以同样的方式嵌入 NavigationToolbar 不会。当我包含以下行时,Tkinter 没有错误地崩溃:

toolbar = NavigationToolbar2TkAgg( canvas, root )
canvas._tkcanvas.grid(row=22,column=4)

我知道这是因为 NavigationToolbar 在内部调用了pack,而packgrid 相处不来。但是,我喜欢网格,并且不想为了能够使用 NavigationToolbar 而不得不重新设计我的整个 GUI。

是否有解决方法,以便我可以通过网格使用 NavigationToolbar2TkAgg? (我找到了“子类和重载”here 的建议,但不知道该怎么做。)

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

你能创建一个空框架,然后将NavigationToolbar 放在那个框架中吗?我假设NavigationToolbar 会在那个框架中自行打包。然后您可以在框架上使用网格。

【讨论】:

我已经试过了:toolbar_frame = Frame(root) toolbar_frame.grid(row=21,column=4,columnspan=2) toolbar = NavigationToolbar2TkAgg( canvas, toolbar_frame ) 确实会显示导航工具栏,谢谢!但是好像没有连接到FigureCanvas? 我刚刚测试了我的应用程序的技巧。工具栏在画布上按预期运行。所以我认为答案是肯定的。【参考方案2】:

这是 Bryan Oakleys 回答中提到的代码示例(将工具栏添加到框架,将框架放在网格上):

    fig = Figure(figsize=(5, 5), dpi=100)

    canvas = FigureCanvasTkAgg(fig, master=root)
    canvas.get_tk_widget().grid(row=1,column=4,columnspan=3,rowspan=20)
    # here: plot suff to your fig
    canvas.draw()

    ###############    TOOLBAR    ###############
    toolbarFrame = Frame(master=root)
    toolbarFrame.grid(row=22,column=4)
    toolbar = NavigationToolbar2TkAgg(canvas, toolbarFrame)

【讨论】:

【参考方案3】:
# the following works for me. I created an empty frame and display it using the grid
# management system, so the frame will be able to use pack management system
canvas = FigureCanvasTkAgg(fig, root)
canvas.draw()
canvas.get_tk_widget().grid(row=2, column=0)
frame = Frame(root)
frame.grid(row=0, column=1)
toobar = NavigationToolbar2Tk(canvas, frame)
canvas.get_tk_widget().grid(row=1, column=0)

【讨论】:

【参考方案4】:

我相信您正在寻找的是pack_toolbar=False kwarg 您的工具栏定义应如下所示:

toolbar = NavigationToolbar2Tk(canvas, root, pack_toolbar=False)

以下两行在NavigationToolbar2TK构造函数中执行:

if pack_toolbar:
        self.pack(side=tk.BOTTOM, fill=tk.X)

所以将pack_toolbar 设置为False 会禁用内部打包,让您可以像往常一样使用网格。

toolbar.grid()

【讨论】:

以上是关于通过网格在 Tkinter 中显示 Matplotlib 导航工具栏的主要内容,如果未能解决你的问题,请参考以下文章

何时在 tkinter 中使用包或网格布局?

带有网格的 tkinter 画布滚动条?

网格填充可滚动区域tkinter中的空白空间

我如何使用python将终端输出到网格中的tkinter框架?

python之tkinter使用-Grid(网格)布局管理器

Python Matplot中文显示完美解决方案