我正在开发一个小型的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在内部调用pack
,pack
和grid
不相处。但是,我喜欢网格,并且不愿重新设计我的整个GUI只是为了能够使用NavigationToolbar。
是否有解决方法以便我可以通过网格使用NavigationToolbar2TkAgg? (我已经找到了“子类和重载”here的建议,但不知道该怎么做。)
任何帮助都非常感谢!
答案 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()