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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:10:25