如何用Python结合CustomTkinter编写函数调整组件Grid布局位置?
训练动作布局调整函数问题解决
需求说明
开发训练动作选择应用,需要实现一个函数:接收目标组件对象,将选中的训练动作组件(如self.bench_press)移至Grid布局的column=1,同时让column=2中所有位于该组件下方的其他组件上移一行。
现有代码片段
import tkinter as Tk from PIL import Image # 类内相关初始化代码 self.exframe = Tk.CTkFrame(master=self.tabview.tab("Workout Builder"), width=400, height=100, fg_color="#333333") self.exframe.grid(row=0, column=0, rowspan=4, sticky="nsew") self.exframe.grid_rowconfigure(4, weight=1) self.scrollable_frame = Tk.CTkScrollableFrame(master=self.exframe, label_text="Your Exercises Choose Exercises", width=1000, height=500, fg_color="#333333") self.scrollable_frame.grid(row=1, column=5, sticky="nsew") self.scrollable_frame.grid_columnconfigure(0, weight=1) self.bench_press_pic = Tk.CTkImage(light_image=Image.open("images/bench-press.png"), dark_image=Image.open("images/bench-press.png"), size=(175, 175)) self.bench_press = Tk.CTkButton(master=self.scrollable_frame, image=self.bench_press_pic, text="Barbell Bench Press", fg_color="#333333", text_color="white", font=Tk.CTkFont(size=26, weight="bold"), hover_color="#444444", corner_radius=38) self.bench_press.grid(row=1, column=2)
尝试的报错函数
def addExercise(exercise): column, row = 1, 1 exercise.grid(column=column, row=row)
问题分析与解决方案
原函数存在两个核心问题:
- 未作为类方法实现,无法访问类内的
scrollable_frame等对象,且直接固定row=1会导致组件重叠 - 未处理
column=2中组件的上移逻辑
以下是修正后的类方法实现:
def addExercise(self, exercise): # 获取目标组件当前的布局信息 current_grid_info = exercise.grid_info() current_row = current_grid_info.get("row", 0) current_col = current_grid_info.get("column", 0) # 找到column=1的最后一行,将目标组件放在下一行(避免重叠) max_target_row = 0 for child in self.scrollable_frame.winfo_children(): child_grid = child.grid_info() if child_grid.get("column") == 1: child_row = child_grid.get("row", 0) if child_row > max_target_row: max_target_row = child_row target_row = max_target_row + 1 exercise.grid(column=1, row=target_row, sticky="nsew") # 若原位置在column=2,将该行下方的所有组件上移一行 if current_col == 2: for child in self.scrollable_frame.winfo_children(): child_grid = child.grid_info() if child_grid.get("column") == 2 and child_grid.get("row", 0) > current_row: child.grid(row=child_grid["row"] - 1)
使用说明
给训练动作按钮绑定命令时,需通过lambda表达式传递组件自身作为参数:
self.bench_press.configure(command=lambda: self.addExercise(self.bench_press))
内容的提问来源于stack exchange,提问作者2185358
相关产品推荐
相关产品推荐

