简体   繁体   English

Matplotlib NavigationToolbar 小部件未显示在 Tkinter GUI 中

[英]Matplotlib NavigationToolbar widget is not displayed in Tkinter GUI

I'm designing a simple GUI with Tkinter composed of a ListBox (with Scrollbar) and a canvas (FigureCanvasTkAgg) to plot.我正在用 Tkinter 设计一个简单的 GUI,它由一个 ListBox(带滚动条)和一个画布(FigureCanvasTkAgg)组成来绘制。 The ListBox is a collection of variables (time series) that are drawn as a xy plot upon selection. ListBox 是一组变量(时间序列),在选择时绘制为 xy 图。 The layout is schematically:布局示意图如下:

|---------------- Menu Bar --------------|
|----------------------------------------|
| |--- Frame 1-- | |------ Frame 2 ------|
| |-- ListBox -- |^|                     |
| |  Item 1      |-|                     |
| |  Item 2      |-|       Canvas        |
| |  Item 3      |-|                     |
| |  Item 4      |-| ------------------- |
| |  Item 5      |-|  Navigation toolbar |
| |--------------|v|---------------------|
|----------------------------------------| 

When the GUI is built, the Navigation Toolbar is absent and I have tried either with both pack() and grid() geometry managers.构建 GUI 时,导航工具栏不存在,我已尝试使用 pack() 和 grid() 几何管理器。 I apologize if the mistake is so evident but I'm not aware of what can be wrong.如果错误如此明显,我深表歉意,但我不知道什么是错误的。 The minimal code is:最小的代码是:

import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from tkinter import *

class Plot_tool(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)            
        self.master = master
        self.master.option_add('*tearOff', 'FALSE')
        self.master.title("Tool")
        self.options = [ i for i in range(50) ] # Some staff in ListBox
        self.pack(fill = BOTH, expand = 1)
        self.init_window()

    def init_window(self):
        menubar = Menu(self.master)
        self.master.config(menu = menubar)

        filemenu = Menu(menubar)
        filemenu.add_command(label = "Load")
        menubar.add_cascade(label = "File", menu = filemenu)

        # Frame 1 (ListBox and Scrollbar)
        framei = LabelFrame(self, text="frame", labelanchor="n")
        framei.pack(side="left", fill=Y)

        scrollbar = Scrollbar(framei)
        scrollbar.pack(side="right",fill=Y)
        self.items = Listbox(framei, yscrollcommand=scrollbar.set)
        self.items.pack(side="left", fill=Y)
        scrollbar.config(command = self.items.yview)
        self.items.insert(0, *self.options)

        # Frame 2 (Canvas and Navigation Toolbar)
        group2 = Frame(self)
        group2.pack(side="right")

        fig = Figure(figsize=(200,100))
        self.eje = fig.add_subplot(111)
        self.figura = FigureCanvasTkAgg(fig, master = group2)
        self.figura.get_tk_widget().pack()
        self.figura.show()

        toolbar = NavigationToolbar2TkAgg(self.figura, group2)
        toolbar.pack()
        toolbar.update()

def on_closing(root):
    root.destroy()
    exit()

def main():
    root = Tk()
    root.geometry("900x500")
    app = Plot_tool(root)
    root.protocol("WM_DELETE_WINDOW", lambda: on_closing(root))
    root.mainloop()

if __name__ == '__main__':
    main()

Sticking to the embedding_in_tk example from the matplotlib page, you'd first create the toolbar and then pack the canvas.坚持 matplotlib 页面中的embedding_in_tk 示例,您首先创建工具栏,然后打包画布。

    group2 = Frame(self)
    group2.pack(side="right")

    fig = Figure(figsize=(200,100))
    self.eje = fig.add_subplot(111)
    self.figura = FigureCanvasTkAgg(fig, master = group2)
    toolbar = NavigationToolbar2TkAgg(self.figura, group2)
    self.figura._tkcanvas.pack()
    toolbar.update()

Additionally, removing self.figura.show() seems to speed up things a lot.此外,删除self.figura.show()似乎可以self.figura.show()加快速度。

Note: In newer versions of matplotlib you should use NavigationToolbar2Tk instead of NavigationToolbar2TkAgg .注意:在较新版本的 matplotlib 中,您应该使用NavigationToolbar2Tk而不是NavigationToolbar2TkAgg

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM