You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter Notebook中Matplotlib图表工具栏显示异常求助

问题:PanedWindow中Notebook第二个标签页的Matplotlib工具栏显示异常

我正在开发一个GUI,在PanedWindow内嵌入了Notebook组件,该Notebook包含两个标签页,每个标签页都配有Matplotlib图表及其工具栏。但第二个标签页的工具栏会跑到PanedWindow外部,必须调整窗口大小才能看到;而第一个标签页无论PanedWindow尺寸如何,图表和工具栏始终正常显示。我是Tkinter和GUI开发的新手,希望能得到解决方法!

创建GUI的类代码

os.chdir(absolute_path+toolbox_path_graph)
from graph_window import graph_window
os.chdir(absolute_path)

class Project(tk.Tk):
     def __init__(self):
         super().__init__()
         
         # 设置窗口
         self.title("Title")
         self.state('zoomed')
         
         # PanedWindow的默认尺寸
         self.dim_paned_windows=({"height":700},{"width":600})

         # 创建PanedWindow
         self.paned_windows()

         self.graph_window_instance=graph_window(np ,tk, ttk, self.graph)
         
        
     def paned_windows(self):
         # 第一层PanedWindow
         panel_1=tk.PanedWindow(bd=2, relief="groove", bg="gray")
         panel_1.pack(fill=tk.BOTH, expand=1)
         
         # 第一个子窗口
         self.paned_window1=tk.Label(panel_1,takefocus=0,highlightthickness=0)
         panel_1.add(self.paned_window1, width=600)
         
         # 第二层垂直PanedWindow
         self.panel_2=tk.PanedWindow(panel_1,bd=0, orient=tk.VERTICAL,relief="groove", bg="gray")
         panel_1.add(self.panel_2)
         
         # 图表窗口容器
         self.graph=tk.Canvas(self.panel_2, bg="white", borderwidth=0, highlightthickness=0, takefocus=0)
         self.panel_2.add(self.graph,height=700)    

         # 第三个子窗口
         self.paned_window3=tk.Label(self.panel_2)
         self.panel_2.add(self.paned_window3)
         
         
if __name__ == "__main__":
     app = Project()
     app.mainloop()

创建图表的类代码

class graph_window:
    def __init__(self, np, tk, ttk, master_frame): # master_frame为PanedWindow容器
        # 导入依赖模块
        self.np=np
        self.tk=tk
        self.ttk=ttk

        # 存储图表相关元素的列表
        self.graph=[]
        self.fig=[]
        self.ax=[]
        self.toolbar=[]
        
        # 初始化执行
        self.main(master_frame)
        
        
    def main(self, master_frame):
        # 创建标签页
        self.tab1, self.tab2=self.setup_tab(master_frame)
        self.setup_graph(self.tab2)
        self.setup_graph(self.tab1)
        
    def setup_tab(self, master_frame):
        # 设置标签页样式,将标签放在左下角
        style=self.ttk.Style(master_frame)
        style.configure('lefttab.TNotebook', tabposition='sw')
        
        # 创建Notebook控件
        tabControl=self.ttk.Notebook(master_frame, style='lefttab.TNotebook')
        tabControl.pack(expand=1, fill=self.tk.BOTH)
        
        # 创建两个标签页框架
        tab1=self.ttk.Frame(tabControl)
        tab2=self.ttk.Frame(tabControl)
         
        # 设置标签页名称
        tabControl.add(tab1, text='tab1')
        tabControl.add(tab2, text='tab2')

        return tab1, tab2
        

    def setup_graph(self, tab_frame):
        fig, ax=plt.subplots()
        
        self.fig.append(fig)
        self.ax.append(ax)

        # 创建Matplotlib画布并添加到标签页
        self.graph.append(FigureCanvasTkAgg(self.fig[-1], master=tab_frame))
        self.graph[-1].get_tk_widget().pack(expand=True, fill=self.tk.BOTH)
        
        # 创建工具栏
        self.toolbar.append(NavigationToolbar2Tk(self.graph[-1], tab_frame, pack_toolbar=False))
        self.toolbar[-1].update()
        self.toolbar[-1].pack()
    
        # 设置坐标轴和标题
        self.ax[-1].set_xlabel('a')
        self.ax[-1].set_ylabel('b')
        self.ax[-1].set_title('title')
        
        # 设置默认坐标范围
        self.ax[-1].set_xlim(0,160)
        self.ax[-1].set_ylim(0,100)

现象说明

  • 启动GUI时:
    • tab1:图表和工具栏正常显示在PanedWindow内部
    • tab2:工具栏位于PanedWindow外部,无法直接看到
  • 调整PanedWindow后:
    • tab2默认状态:工具栏仍不可见
    • 手动调整窗口大小后:工具栏才正常显示,与tab1表现一致

我尝试改用grid布局,但未能实现tab1的正常显示效果。


内容的提问来源于stack exchange,提问作者Lenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:35:56