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
相关产品推荐
相关产品推荐

