Tkinter下拉菜单(OptionMenu)对齐异常问题求助
解决Tkinter下拉列表偏移问题
嘿,我一眼就看出问题出在哪了——你这第二个下拉框偏移的问题,根源是控件的父容器不统一!咱们来一步步修复它:
问题分析
你在setupPage函数里创建了content这个Frame来放置标签,但两个OptionMenu(drop和drop2)却是直接把root当作父组件的。这就导致标签和下拉框不在同一个布局容器里,它们的grid布局是分别基于content和root计算的,自然没法对齐,出现偏移。
修复步骤
- 把两个
OptionMenu的父组件从root改成content,让所有控件归属于同一个Frame; - 保持原有
grid的列、行设置不变,这样标签和下拉框就能在同一个布局体系里对齐了。
修正后的setupPage函数
def setupPage(root): content = ttk.Frame(root) #frame for placing everything into #frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=100) #frame for placing images lbl1 = ttk.Label(content, text="Select meterial 1",font=("arial",12)) #setup of label for screen 1 lbl2 = ttk.Label(content, text = "Select meterial 2" ,font = ("arial",12)) content.grid(column=0, row=0) lbl1.grid(column=0, row=0,columnspan=1, pady=10,padx=10) lbl2.grid(column=1,row=0,columnspan=1,pady=10,padx=10) clicked = StringVar() clicked.set("lo2") clicked2 = StringVar() clicked2.set("lo2") # 这里把父组件从root改成content drop2 = OptionMenu(content, clicked2, "lo2", "mo3", "Lo2+mo3") drop = OptionMenu(content, clicked, "lo2", "mo3", "Lo2+mo3") drop.grid(column=0, row=1,pady=10,padx=10,sticky=NW) drop2.grid(column=1, row=1,pady=10,padx=10,sticky=NW)
完整修正代码
from tkinter import * from tkinter import ttk root = Tk() def startPage(root): content = ttk.Frame(root) #frame for placing everything into #frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=100) #frame for placing images lbl1 = ttk.Label(content, text="Is this a new or existing site?",font=("arial",12)) #setup of label for screen 1 yesvar = BooleanVar() #variables for check boxes later on novar = BooleanVar() yesvar.set(False) novar.set(False) one = ttk.Checkbutton(content, text="Yes", variable=yesvar, onvalue=True) #check buttons setup two = ttk.Checkbutton(content, text="No", variable=novar, onvalue=True) ok = ttk.Button(content, text="New", command = nextPage) #setup for buttons screen 1 cancel = ttk.Button(content, text="Existing") content.grid(column=0, row=0) #initialises content #frame.grid(column=0, row=0, columnspan=3, rowspan=2) lbl1.grid(column=0, row=0, columnspan=3,pady=10,padx=10) #places the label asking the question with a gap either side for the window bindings #name.grid(column=3, row=1, columnspan=2) #one.grid(column=0, row=3) #two.grid(column=1, row=3) ok.grid(column=0, row=1,pady=10,padx=10) #places yes button 10 away from each edge cancel.grid(column=1, row=1,pady=10,padx=10) #as above def setupPage(root): content = ttk.Frame(root) #frame for placing everything into #frame = ttk.Frame(content, borderwidth=5, relief="sunken", width=200, height=100) #frame for placing images lbl1 = ttk.Label(content, text="Select meterial 1",font=("arial",12)) #setup of label for screen 1 lbl2 = ttk.Label(content, text = "Select meterial 2" ,font = ("arial",12)) content.grid(column=0, row=0) lbl1.grid(column=0, row=0,columnspan=1, pady=10,padx=10) lbl2.grid(column=1,row=0,columnspan=1,pady=10,padx=10) clicked = StringVar() clicked.set("lo2") clicked2 = StringVar() clicked2.set("lo2") # 修改父组件为content drop2 = OptionMenu(content, clicked2, "lo2", "mo3", "Lo2+mo3") drop = OptionMenu(content, clicked, "lo2", "mo3", "Lo2+mo3") drop.grid(column=0, row=1,pady=10,padx=10,sticky=NW) drop2.grid(column=1, row=1,pady=10,padx=10,sticky=NW) def nextPage(): global pagenum, root for widget in root.winfo_children(): widget.destroy() if pagenum == 1: setupPage(root) pagenum = 2 else : startPage(root) pagenum = 1 startPage(root) pagenum = 1 root.mainloop()
这样修改后,两个下拉框就会和对应的标签完美对齐,不会再出现偏移问题啦!
内容的提问来源于stack exchange,提问作者rumdibbilyosis
相关产品推荐
相关产品推荐

