为何tkinter中sticky='e'无法将组件附着在窗口右侧?
问题原因及解决方法
你的问题和用类创建窗口完全无关,核心问题出在Frame的布局配置以及grid列的权重设置上:
- Frame未占满窗口宽度:你用
self.start_frame.pack()默认方式布局Frame时,Frame只会包裹内部组件的最小宽度,不会扩展到窗口的整个宽度。所以你设置的sticky='e'只能让组件在这个小Frame内靠右,而非屏幕右侧。 - Grid列未设置权重:即便Frame占满窗口宽度,
grid布局的列默认没有权重,列宽度只会适应组件内容,不会随容器拉伸,组件依然没法贴到容器边缘。
修正后的代码
import tkinter as tk def play(): pass class App(tk.Tk): def __init__(self): tk.Tk.__init__(self) font = ('Cascadia Mono SemiLight', 20) self.start_frame = tk.Frame() # 让Frame横向填充整个窗口宽度,padx/pady为可选内边距 self.start_frame.pack(fill='x', padx=10, pady=10) # 给grid第0列设置权重1,让它随容器宽度自动拉伸 self.start_frame.columnconfigure(0, weight=1) self.title('Test') self.geometry('500x600') self.title_label = tk.Label(self.start_frame, text='Password Memoriser', font=font) self.title_label.grid(row=0, column=0, sticky='w') self.play_button = tk.Button(self.start_frame, text='Play', command=play, font=font) self.play_button.grid(row=2, column=0) self.len_entry = tk.Entry(self.start_frame, font=font, width=4) self.len_entry.grid(row=1, column=0, sticky='e') my_app = App() my_app.mainloop()
关键改动说明
self.start_frame.pack(fill='x', padx=10, pady=10):fill='x'让Frame横向填充父容器(窗口)的宽度,padx/pady避免组件直接贴到窗口边缘,提升视觉效果。self.start_frame.columnconfigure(0, weight=1):给第0列设置权重1,当容器宽度变化时,该列会自动拉伸占满可用空间,此时sticky='e'就能让Entry组件贴到Frame(也就是窗口)的右侧。
内容的提问来源于stack exchange,提问作者Usman
相关产品推荐
相关产品推荐

