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

Tkinter下拉菜单(OptionMenu)对齐异常问题求助

解决Tkinter下拉列表偏移问题

嘿,我一眼就看出问题出在哪了——你这第二个下拉框偏移的问题,根源是控件的父容器不统一!咱们来一步步修复它:

问题分析

你在setupPage函数里创建了content这个Frame来放置标签,但两个OptionMenu(drop和drop2)却是直接把root当作父组件的。这就导致标签和下拉框不在同一个布局容器里,它们的grid布局是分别基于content和root计算的,自然没法对齐,出现偏移。

修复步骤

  1. 把两个OptionMenu的父组件从root改成content,让所有控件归属于同一个Frame;
  2. 保持原有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:57:59