【问题标题】:Displaying Matplotlib Navigation Toolbar in Tkinter via grid通过网格在 Tkinter 中显示 Matplotlib 导航工具栏
【发布时间】: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,而packgrid 相处不来。但是,我喜欢网格,并且不想为了能够使用 NavigationToolbar 而不得不重新设计我的整个 GUI。

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

非常感谢任何帮助!

【问题讨论】:

    标签: grid matplotlib tkinter


    【解决方案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()
        

        【讨论】:

          猜你喜欢
          • 2015-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-20
          相关资源
          最近更新 更多