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
相关产品推荐
相关产品推荐

