如何在Tkinter的Toplevel窗口中让文本框贴近“Name:”标签?
问题描述
我开发的程序会生成一个Toplevel弹窗,希望其中的文本框能更贴近“Name:”标签,但尝试使用sticky和pad参数后并未达到预期效果。
相关代码如下:
def editWindow(): item_choice_intvar = tk.IntVar() course_choice_intvar = tk.IntVar() editMenu = tk.Toplevel() editMenu.geometry('400x400') editMenu.resizable(False, False) editMenu['bg'] = 'black' editMenu.title('Configure Menu') addItem = tk.Label(editMenu, text="Add Item:", font=("Garamond", 20), bg='black') addItem.grid(column=0, row=0, sticky='WN', pady=10, padx=20) itemChoice = tk.Radiobutton(editMenu, text='Menu Item', variable=item_choice_intvar, value=1, bg='black') dealChoice = tk.Radiobutton(editMenu, text='Special Deal', variable=item_choice_intvar, value=2, bg='black') itemChoice.grid(column=0, row=1) dealChoice.grid(column=1, row=1) courseText = tk.Label(editMenu, text="Select Course:", font=("Garamond", 20), bg='black') courseText.grid(column=0, row=2, sticky='N', pady=10, padx=20) entreeChoice = tk.Radiobutton(editMenu, text='Entree', variable=course_choice_intvar, value=1, bg='black') mainChoice = tk.Radiobutton(editMenu, text='Main', variable=course_choice_intvar, value=2, bg='black') dessertChoice = tk.Radiobutton(editMenu, text='Dessert', variable=course_choice_intvar, value=3, bg='black') entreeChoice.grid(column=0, row=3) mainChoice.grid(column=1, row=3, sticky='W') dessertChoice.grid(column=2, row=3, sticky='W') itemNameText = tk.Label(editMenu, text='Name: ', font=("Garamond", 15), bg='black') nameTextField = tk.Text(editMenu, height=1, width=15) itemNameText.grid(column=0, row=4, sticky='W', padx=25, pady=30) nameTextField.grid(column=1, row=4, sticky='W')
界面显示:“Name:”标签和右侧文本框之间存在明显间距,无法通过常规sticky和pad参数缩小。
解决方案
问题根源是grid布局的列被前面的控件(比如第三行的三个单选按钮)撑开了,导致第0列和第1列之间默认产生了宽间距,和你设置的sticky、pad无关。
下面是两种可行的解决方法:
方法1:用Frame包裹标签和文本框
把“Name:”标签和文本框放到同一个Frame里,用pack布局让它们紧贴,再把这个Frame放到grid中:
# 替换原代码中itemNameText和nameTextField的创建及布局代码 name_frame = tk.Frame(editMenu, bg='black') name_frame.grid(column=0, row=4, sticky='W', padx=25, pady=30) itemNameText = tk.Label(name_frame, text='Name: ', font=("Garamond",15), bg='black') nameTextField = tk.Text(name_frame, height=1, width=15) itemNameText.pack(side='left') nameTextField.pack(side='left', padx=3) # padx可按需微调间距大小
方法2:重置grid列的配置
手动设置所有列的权重为0,避免列被撑开,再给文本框加小间距:
# 在创建editMenu后添加以下代码,锁定列宽 editMenu.grid_columnconfigure(0, weight=0) editMenu.grid_columnconfigure(1, weight=0) editMenu.grid_columnconfigure(2, weight=0) # 调整文本框的grid参数 nameTextField.grid(column=1, row=4, sticky='W', padx=5)
额外优化建议
单行文本输入更适合用tk.Entry控件,tk.Text是为多行设计的,可能会自带额外的内边距:
nameTextField = tk.Entry(editMenu, width=15) # 替换原Text控件
内容的提问来源于stack exchange,提问作者Zayan Anwar
相关产品推荐
相关产品推荐

