如何让CustomTkinter画布内的Frame扩展至画布尺寸?
解决CustomTkinter画布中Frame无法填充右侧的问题
问题根源
你通过create_window将frame_graphs添加到画布后,该Frame默认不会自动跟随画布宽度调整;仅设置sticky="nsew"和expand会破坏滚动条逻辑,导致滚动区域计算冲突。
解决方案
1. 修改画布<Configure>绑定,同步Frame宽度
替换原有的画布绑定事件,在画布尺寸变化时强制让frame_graphs宽度匹配画布可视宽度:
def on_canvas_configure(self, event): # 让frame_graphs宽度与画布可视区域一致 self.graphcanvas.itemconfig(self.secondframeid, width=event.width) # 更新滚动区域范围 self.graphcanvas.configure(scrollregion=self.graphcanvas.bbox("all")) # 替换原绑定代码 self.graphcanvas.bind("<Configure>", self.on_canvas_configure)
2. 配置frame_graphs的列权重
确保frame_graphs内部列能自动填充宽度,在创建该Frame后添加列配置:
self.frame_graphs = customtkinter.CTkFrame(master=self.graphcanvas) # 根据实际使用的列数配置权重,示例为0、1列 self.frame_graphs.grid_columnconfigure((0,1), weight=1) self.secondframeid = self.graphcanvas.create_window((0, 0), window=self.frame_graphs, anchor="nw")
3. 调整图表组件的grid参数
在plt_freq_neg_word函数中,给图表的tk_widget添加sticky="nsew",让图表填充所在单元格:
line2.get_tk_widget().grid(row=4, column=hotelcolumn, padx=10, pady=10, columnspan=2, sticky="nsew")
完整修改后的关键代码片段
# 布局创建代码修改部分 else: self.graphcanvas = customtkinter.CTkCanvas(master=self.frame_info, background="#333333", highlightthickness=0) self.graphcanvas.grid(row=1, column=0, columnspan=4, padx=20, pady=20, sticky="nsew") self.ctk_scrollbar = customtkinter.CTkScrollbar(master=self.frame_info, command=self.graphcanvas.yview, scrollbar_color="white", background="grey") self.ctk_scrollbar.grid(row=1, column=4, sticky="ns") self.graphcanvas.configure(yscrollcommand=self.ctk_scrollbar.set) self.frame_graphs = customtkinter.CTkFrame(master=self.graphcanvas) # 配置frame_graphs列权重 self.frame_graphs.grid_columnconfigure((0,1), weight=1) self.secondframeid = self.graphcanvas.create_window((0, 0), window=self.frame_graphs, anchor="nw") # 绑定自定义配置事件 self.graphcanvas.bind("<Configure>", self.on_canvas_configure) getcompreddata(self, hotel1, hotel2) # 新增的画布配置事件处理函数 def on_canvas_configure(self, event): self.graphcanvas.itemconfig(self.secondframeid, width=event.width) self.graphcanvas.configure(scrollregion=self.graphcanvas.bbox("all")) # 图表生成函数修改部分 def plt_freq_neg_word(self, dataframe, hotelcolumn): # ... 原有业务代码 ... line2.get_tk_widget().grid(row=4, column=hotelcolumn, padx=10, pady=10, columnspan=2, sticky="nsew") # ... 原有业务代码 ...
修改后,frame_graphs会自动填充画布右侧宽度,同时滚动条功能保持正常,滚动区域计算与Frame宽度调整同步。
内容的提问来源于stack exchange,提问作者IvanPyw
相关产品推荐
相关产品推荐

