Python Tkinter打开新窗口时Button控件不显示问题
问题根因
弹出空白Toplevel窗口是两个Tkinter基础使用疏漏导致的:
- 创建Button时未显式指定父容器为新建的
top2弹窗,控件默认会被挂载到主窗口root下,不会出现在弹窗中 - 控件创建后未调用任何布局方法(
pack()/grid()/place()),Tkinter不会自动把控件渲染到窗口上 - 补充隐患:函数内创建的Tkinter控件/图片属于局部变量,会被Python垃圾回收机制自动回收,就算布局正确也可能出现显示异常,最好把控件引用绑定到对应窗口实例上规避问题。
修复方法
调整new_win()函数内的控件创建逻辑即可:
- 创建Button时第一个参数传入
top2,显式指定控件所属的父窗口 - 调用布局方法将Button放置到窗口上
- 把控件引用绑定到
top2实例,避免局部变量被回收
修正后的可运行代码:
from tkinter import * from playsound import playsound import os # 创建主窗口 root = Tk() root.geometry("200x200") def new_win(): top2 = Toplevel(root) top2.geometry('200x200') top2.title("display Window") # 显式指定Button父容器为top2 button = Button(top2, text='wtf') # 调用pack布局把控件渲染到窗口 button.pack(pady=50) # 保存控件引用,避免垃圾回收导致显示异常 top2.button = button def changecolor(event): new_win() # 创建列表框 listbox = Listbox(root , font=('times 20 bold'), height=5,width=10) listbox.insert(1, 'first') listbox.insert(2, 'second') listbox.insert(3, 'third') listbox.insert(4, 'forth') listbox.pack(pady=20) # 绑定列表选择事件 listbox.bind('<<ListboxSelect>>', changecolor) root.mainloop()
注意事项
- 所有Tkinter控件创建后必须主动调用布局方法,不存在默认自动布局的逻辑,这是新手最常踩的基础坑
- 如果后续启用你注释掉的
PhotoImage图片加载逻辑,同样需要指定父容器、调用布局、绑定图片引用到窗口实例,否则会出现图片加载后不显示的问题
内容的提问来源于stack exchange,提问作者user19227202
相关产品推荐
相关产品推荐

