如何在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
相关产品推荐
相关产品推荐

