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


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

任何帮助非常感谢!


4109
2017-10-16 11:36


起源



答案:


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


12
2017-10-16 12:40



我试过了: toolbar_frame = Frame(root)  toolbar_frame.grid(row=21,column=4,columnspan=2)  toolbar = NavigationToolbar2TkAgg( canvas, toolbar_frame ) 这确实显示了导航工具栏,谢谢!但它似乎没有连接到FigureCanvas? - CodingCat
我刚刚测试了我的应用程序的技巧。工具栏在画布上按预期运行。所以我认为答案是肯定的。 - Bogey Jammer


答案:


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


12
2017-10-16 12:40



我试过了: toolbar_frame = Frame(root)  toolbar_frame.grid(row=21,column=4,columnspan=2)  toolbar = NavigationToolbar2TkAgg( canvas, toolbar_frame ) 这确实显示了导航工具栏,谢谢!但它似乎没有连接到FigureCanvas? - CodingCat
我刚刚测试了我的应用程序的技巧。工具栏在画布上按预期运行。所以我认为答案是肯定的。 - Bogey Jammer


下面是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)

0
2018-06-25 07:59