22

我正在开发一个小的 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?(我在这里找到了“子类和重载”的建议但不知道该怎么做。)

非常感谢任何帮助!

4

4 回答 4

15

您可以创建一个空框架,然后将其NavigationToolbar放入该框架中吗?我假设NavigationToolbar意志然后将自己包装在那个框架中。然后,您可以在框架上使用网格。

于 2012-10-16T12:40:36.460 回答
11

这是 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)
于 2018-06-25T07:59:08.010 回答
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)
于 2020-05-18T20:28:43.690 回答
1

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

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

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

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

因此设置pack_toolbarFalse禁用内部包装,允许您像往常一样使用网格。

toolbar.grid()
于 2021-06-01T00:19:59.653 回答