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

Tkinter代码可运行但窗口不显示,下拉列表相关问题求助

问题排查与解决方案

我来帮你搞定这个Tkinter窗口不显示的问题——你的代码里有几个关键问题,咱们逐个解决:

1. 核心原因:混合使用布局管理器导致布局死循环

你给OptionMenu同时调用了pack()和grid():

CodeDDL.pack()  # 这里用了pack
CodeDDL.grid(row=3, column=0)  # 又用了grid

Tkinter的规则是:同一个父容器下不能同时混用pack和grid布局管理器,一旦混用,Tkinter会陷入布局计算的死循环,直接导致窗口无法渲染显示。这也是为什么你注释掉这段代码后窗口能正常出来的原因。

解决方法:

删掉其中一个布局调用,因为你给Label用的是grid,所以保留grid更合理,把CodeDDL.pack()这行删掉就行。

2. 次要问题:未定义的函数引用

你的代码里调用了doNothing、exitmeth、InsertImgcmd、printP4dcD这些函数,但完全没定义它们。就算窗口能显示,点击对应的菜单或按钮也会直接报错。需要补充这些函数的基础定义,比如:

def doNothing():
    # 占位函数,暂时什么都不做
    pass

def exitmeth():
    # 退出程序的函数
    root.quit()

def InsertImgcmd():
    # 插入图片的占位函数
    pass

def printP4dcD():
    # 打印的占位函数
    pass

3. 可选优化:全局变量的作用域问题

你的Code类里直接往全局的codesList和namesList里添加元素,虽然当前代码能运行,但最好在类的__init__方法里显式声明这些是全局变量,避免后续扩展代码时出现作用域bug:

class Code:
    def __init__(self, code, name, skill, description):
        global codesList, namesList
        self.code = code
        self.name = name
        self.skill = skill
        self.description = description
        codesList.append(self)
        namesList.append(name)

修正后的完整代码

from tkinter import *

########### Create main window, call it root ###########
root = Tk()

# 补充未定义的函数
def doNothing():
    pass

def exitmeth():
    root.quit()

def InsertImgcmd():
    pass

def printP4dcD():
    pass

#Defining classes and methods
class Code:
    def __init__(self, code, name, skill, description):
        global codesList, namesList
        self.code = code
        self.name = name
        self.skill = skill
        self.description = description
        codesList.append(self)
        namesList.append(name)

#Defining variables
codesList = []
namesList = []
selectedname = StringVar()
selectedname.set('Please select the correct knowledge category necessary to resolve the ticket.')

A11 = Code(11, 'Fundamentals', 'A', '')
B11 = Code(11,'Geology', 'B', '')
B12 = Code(12,'Reservoir Engineering', 'B', '')

########### Create list of Dictionaries ###########
TypeD = {}
SiteD = {}
P4dcD = {}
SkillD = {}

########### Create Incident Types Dictionary###########
TypeD = dict(Normal='NORMAL', \
             Parent='PARENT', \
             Child='CHILD')
TypeNameL = list()
for i in TypeD.keys():
    TypeNameL.append(i)

########### Create Skill Levels ###########
SkillD = dict(Awareness = 'A', \
              Foundation = 'B', \
              Skill = 'C', \
              Advance = 'D')
SkillNameL = list()
for i in SkillD.keys():
    SkillNameL.append(i)

########### Create main menu ###########
mainmenu = Menu(root)
root.config(menu = mainmenu)

submenu = Menu(mainmenu)
mainmenu.add_cascade(label = "File", menu=submenu)
submenu.add_command(label = "New Project", command=doNothing)
submenu.add_separator()
submenu.add_command(label = "Exit", command= exitmeth)

editmenu = Menu(mainmenu)
mainmenu.add_cascade(label = "Edit", menu=editmenu)
editmenu.add_command(label = "Redo", command = doNothing)

########### Toolbar ###########
toolbar = Frame(root, bg="blue")
insertButt = Button(toolbar, text = "Insert image", command = InsertImgcmd)
insertButt.pack(side=LEFT, padx = 2, pady=2)
printButt = Button(toolbar, text="Print", command = printP4dcD)
printButt.pack(side=LEFT, padx = 2, pady=2)
toolbar.pack(side=TOP, fill=X)

########### Create Dropdown list for Code corresponding name ###########
LabelCodeDDL = Label(root, text="Petrel Code").grid(row=2, column=0, sticky=W)
CodeDDL = OptionMenu(root, selectedname, *namesList)
# 删掉了CodeDDL.pack()这行
CodeDDL.configure(font=("Calibri", 11))
CodeDDL.grid(row=3, column=0)

########## Statusbar ##########
statusbar = Label(root, text='', bd=1, relief=SUNKEN, anchor=W)
statusbar.pack(side=BOTTOM, fill=X)

root.title("Ticket Summary Tool")
root.geometry("300x200")
root.mainloop()

现在运行这段代码,窗口就能正常显示,下拉菜单也能正常工作了~

内容的提问来源于stack exchange,提问作者g9c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:33:12