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

时间:2012-10-16 11:36:49

标签: grid matplotlib tkinter

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

我根据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在内部调用packpackgrid不相处。但是,我喜欢网格,并且不愿重新设计我的整个GUI只是为了能够使用NavigationToolbar。

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

任何帮助都非常感谢!

4 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:4)

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

geopoints

答案 2 :(得分:1)

# 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)

答案 3 :(得分:0)

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

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

这会禁用内部打包功能:

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

允许您像往常一样使用网格。

toolbar.grid()