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

如何在Frame类中使4x4 Entry组件网格居中并均匀分布?

自定义Tkinter布局问题:4x4 Entry网格无法填充父容器
  • 本人刚接触OOP和tkinter/customtkinter,这是用类构建的第三个项目,目前仅UI布局存在问题
  • 主窗口包含待移除的背景图标签与三个Frame,已将frame1、frame2、frame3均匀分布,且给frame1设置了2倍权重
  • 在WidgetFrame类中创建的4x4 Entry组件网格位于board_frame内(board_frame是frame1的子容器),期望该网格及board_frame能扩展填充frame1并保持形状位置均匀,但调整grid权重与sticky属性后,Entry可移动缩放却无法填满容器,board_frame也无法填充父容器
  • 已尝试调整根Frame的grid行列权重、全局设置sticky="nsew"等方法,问题仍未解决

相关代码

WidgetFrame类

class WidgetFrame(ctk.CTkFrame):
    def __init__(self, parent_frame):
        super().__init__(parent_frame)
        
        self.solve_label = ctk.CTkImage(dark_image=Image.open(os.path.join(assets, "solve.png")), light_image=None, size=(15, 15))
        
        for i in range(4):
            ctk.CTkButton(self.button_frame, text=f"{i}", width=130).grid(row=i, column=0, padx=10, pady=10)

            if i == 3:
                ctk.CTkButton(self.button_frame, text="Quit", width=130, command=self.destroy).grid(row=i, column=0, padx=10, pady=10)

            elif i == 2:
                ctk.CTkButton(self.button_frame, text="Help", width=130, command=self.help).grid(row=i, column=0, padx=10, pady=10)

            elif i == 1:
                ctk.CTkButton(self.button_frame, text="Clear", command=self.clear_entries, text_color="black", width=130, fg_color="#e79a00", hover_color="#ffaa00").grid(row=i, column=0, padx=10, pady=10)
                
            elif i == 0:
                 ctk.CTkButton(self.button_frame,  text="Solve", command=self.solve_board, text_color="black", image=self.solve_label, fg_color="#009f00", hover_color="#005900").grid(row=i, column=0, padx=10, pady=10)


        self.entry_vars = [[ctk.StringVar() for _ in range(4)] for _ in range(4)]

        self.board_entries = []
        for i in range(4):
            row_entries = []
            for j in range(4):
                entry = ctk.CTkEntry(
                    self.board_frame,
                    bg_color="transparent",
                    fg_color="transparent",
                    justify="center",
                    width=55,
                    height=55,
                    textvariable=self.entry_vars[i][j],
                    corner_radius=2
                )
                entry.grid(row=i, column=j, padx=4, pady=4, sticky="nsew")
                row_entries.append(entry)
                
                self.entry_vars[i][j].trace_add(
                    "write", lambda *args, r=i, c=j: self.validate_entry(r, c)
                )
            self.board_entries.append(row_entries)
            print(self.grid_slaves(0, 0)) # DEBUG

MainWindow类

class MainWindow(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.title("Wordament Solver")
        self.entryfont = ctk.CTkFont(family=fontfile, size=26)


        self.image = ctk.CTkImage(Image.open(os.path.join(assets, "colorkit.png")), size=(2280, 1700))
        self.geometry(CenterWindowToDisplay(self, 620, 610, self._get_window_scaling()))
        self.resizable(False, False)
        self.minsize(620, 570)

        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)
        self.grid_rowconfigure(0, weight=1)
        self.grid_rowconfigure(1, weight=1)


        self.background_label = ctk.CTkLabel(self, image=self.image, text="", anchor="center")
        self.background_label.grid(row=0, column=0, sticky="nsew")


        self.main_frame = ctk.CTkFrame(self, bg_color="transparent", fg_color="transparent", corner_radius=0)
        self.main_frame.grid(row=0, column=0, padx=5, pady=5, sticky="nsew")
        self.main_frame.grid_rowconfigure(0, weight=1)
        self.main_frame.grid_rowconfigure(1, weight=1)
        self.main_frame.grid_columnconfigure(0, weight=2)
        self.main_frame.grid_columnconfigure(1, weight=1)
        
        
        self.frame1 = ctk.CTkFrame(self.main_frame, border_width=0, bg_color="transparent", fg_color="transparent", corner_radius=0)
        self.frame1.grid(row=0, column=0, padx=5, pady=5, ipady=5)
        self.frame1.grid_rowconfigure(0, weight=1)
        self.frame1.grid_columnconfigure(0, weight=1)
        
        self.frame2 = ctk.CTkFrame(self.main_frame, bg_color="transparent", corner_radius=0)
        self.frame2.grid(row=0, column=1, padx=5, pady=5, sticky="nswe")
        self.frame2.grid_rowconfigure(0, weight=1)
        self.frame2.grid_columnconfigure(0, weight=1)
        
        self.frame3 = ctk.CTkFrame(self.main_frame, bg_color="transparent", corner_radius=0)
        self.frame3.grid(row=1, column=0, padx=10, pady=5, sticky="nsew", columnspan=2)
        self.frame3.grid_rowconfigure(1, weight=1)
        self.frame3.grid_columnconfigure(0, weight=1)
               
        self.button_frame = WidgetFrame(self.frame2)
        self.button_frame.grid(row=0, column=0, padx=5, pady=10, ipady=10, sticky="nsew")
        self.button_frame.grid_rowconfigure(0, weight=1)
        self.button_frame.grid_columnconfigure(0, weight=1)

        self.board_frame = WidgetFrame(self.frame1)
        self.board_frame.grid(row=0, column=0, padx=5, pady=5, ipady=5, sticky="nsew")
        self.board_frame.grid_rowconfigure(0, weight=0)
        self.board_frame.grid_columnconfigure(0, weight=1)

        create_widgets(self)

补充说明

已尝试调整根Frame的grid行列权重、从父到子设置sticky="nsew"等方法,代码复制时部分格式可能有误。

内容的提问来源于stack exchange,提问作者nannerpuss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 20:00:08