CustomTkinter Frame第二行被压缩问题求助
CustomTkinter Frame第二行被压缩问题求助
看起来你遇到的布局压缩问题主要是全局变量row的使用逻辑混乱加上Frame内新增行没有配置权重导致的,咱们一步步来拆解修复:
问题根源分析
- 全局变量
row的误用:你用了全局row=0,在add_new函数一开始就执行row +=1,导致初始的三个按钮被放在frame的row=1、row=1、row=2的位置,但你的frame只给row=0和row=1设置了weight=1,row=2没有权重配置,这就会让布局引擎优先压缩没有权重的行,进而影响整体布局。 - 动态新增行未配置权重:当你通过输入框添加新按钮时,新增的行同样没有被设置
weight=1,导致这些行只会占用刚好容纳按钮的空间,挤压了已有行的空间。 - 按钮放置逻辑的小bug:
add_new里的count变量判断行号的逻辑有点绕,容易导致行号计算错误,不如直接通过索引来计算行和列更直观。
修复后的完整代码
import customtkinter as ctk import tkinter as tk import pyglet as pg pg.font.add_file("Inter-Black.ttf") class GUI: def __init__(self): self.btns = [{"name":"shirt", "num" : 0},{"name":"pants", "num" : 0},{"name":"uniform", "num" : 0}] self.ref = [] self.root = ctk.CTk() self.root.title("Laundry App V.1") self.root.geometry("700x500") self.root.columnconfigure(0, weight=1) self.root.rowconfigure(0, weight=1) self.root.rowconfigure(1, weight=2) self.frame = ctk.CTkFrame(self.root) self.frame.grid(row=1, sticky="nswe") # 先不预先配置frame的行,而是动态添加时配置 self.frame.columnconfigure(0, weight=1) self.frame.columnconfigure(1, weight=1) self.entry = ctk.CTkEntry(self.root, width=250, placeholder_text="Enter new item", placeholder_text_color="grey", ) self.entry.grid(row=0, columnspan=1, padx=10, pady=10) # 加些内边距更美观 self.entry.bind("<KeyPress>", self.check) # 初始化添加默认按钮 self.add_default_btns() self.root.mainloop() def add_default_btns(self): # 直接通过索引计算行和列:行号 = 索引 // 2,列号 = 索引 % 2 for idx, item in enumerate(self.btns): row_num = idx // 2 col_num = idx % 2 # 动态配置当前行的权重 self.frame.rowconfigure(row_num, weight=1) # 创建按钮 btn = ctk.CTkButton(self.frame, text=f"{item['name'].upper()} : {item['num']}", font=("inter black", 30), command=lambda n=item: self.add_quant(n) # 绑定计数函数 ) btn.grid(row=row_num, column=col_num, sticky="nswe", padx=5, pady=5) self.ref.append(btn) def check(self, event): if event.keycode == 13: # 回车键 new_item_name = self.entry.get().strip() if new_item_name: # 非空才添加 self.add_new_btn(new_item_name) self.entry.delete(0, tk.END) # 清空输入框 def add_new_btn(self, name): # 添加新的item到列表 self.btns.append({"name": name, "num": 0}) idx = len(self.btns) - 1 row_num = idx // 2 col_num = idx % 2 # 配置新行的权重(如果还没配置过) try: self.frame.rowconfigure(row_num, weight=1) except: pass # 已经配置过的话忽略 # 创建新按钮 btn = ctk.CTkButton(self.frame, text=f"{name.upper()} : 0", font=("inter black", 30), command=lambda n=self.btns[-1]: self.add_quant(n) ) btn.grid(row=row_num, column=col_num, sticky="nswe", padx=5, pady=5) self.ref.append(btn) def add_quant(self, item): # 实现计数逻辑,更新按钮文本 item["num"] += 1 # 找到对应的按钮并更新文本 for btn in self.ref: if btn.cget("text").startswith(item["name"].upper()): btn.configure(text=f"{item['name'].upper()} : {item['num']}") break GUI()
关键修复点说明
- 移除全局变量
row:改用enumerate获取索引,通过idx // 2计算行号,idx % 2计算列号,逻辑更清晰,避免全局变量带来的意外值。 - 动态配置行权重:每次添加按钮时,为对应的行设置
weight=1,这样Frame内的所有行都会平等分配垂直空间,不会出现压缩问题。 - 优化输入框逻辑:添加了非空判断,清空输入框的操作,提升用户体验。
- 绑定计数函数:给每个按钮绑定了
add_quant方法,点击按钮可以增加计数并更新文本,完善了核心功能。
备注:内容来源于stack exchange,提问作者Donj
相关产品推荐
相关产品推荐

