通过网格在 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
,而pack
和grid
相处不来。但是,我喜欢网格,并且不想为了能够使用 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 导航工具栏的主要内容,如果未能解决你的问题,请参考以下文章
我如何使用python将终端输出到网格中的tkinter框架?