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

CustomTkinter Frame第二行被压缩问题求助

CustomTkinter Frame第二行被压缩问题求助

看起来你遇到的布局压缩问题主要是全局变量row的使用逻辑混乱加上Frame内新增行没有配置权重导致的,咱们一步步来拆解修复:

问题根源分析

  1. 全局变量row的误用:你用了全局row=0,在add_new函数一开始就执行row +=1,导致初始的三个按钮被放在frame的row=1、row=1、row=2的位置,但你的frame只给row=0和row=1设置了weight=1,row=2没有权重配置,这就会让布局引擎优先压缩没有权重的行,进而影响整体布局。
  2. 动态新增行未配置权重:当你通过输入框添加新按钮时,新增的行同样没有被设置weight=1,导致这些行只会占用刚好容纳按钮的空间,挤压了已有行的空间。
  3. 按钮放置逻辑的小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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 09:38:06