Tkinter使用Canvas创建背景图后新窗口所有控件消失问题求助
问题原因
- 图片对象引用丢失:
selectname函数内定义的lobby属于局部变量,函数执行完成后就会被Python垃圾回收机制销毁,Tkinter不会主动持有图片对象的引用,导致canvas背景图失效,进一步干扰同窗口下其他控件的渲染。 - 多主窗口实例冲突:Tkinter程序只允许存在一个主
Tk()实例,你在子窗口中再次调用Tk()会导致资源上下文、消息循环混乱,也会触发控件渲染异常的问题。
解决方法
按照以下两个步骤修改代码即可修复问题:
- 子窗口改用
Toplevel()实例化,不要重复创建Tk()实例 - 给子窗口的图片对象添加持久引用,比如绑定到canvas组件的自定义属性上,避免被垃圾回收
修改后的selectname函数代码示例:
def selectname(): # 改用Toplevel创建子窗口,不要重复实例化Tk mainmenu = Toplevel() mainmenu.title("PROF NAME") mainmenu.geometry("1200x600") lobby = ImageTk.PhotoImage(Image.open("CAU_310_MAP/Pictures/lobby.png")) canvas = Canvas(mainmenu, width = 1200, height = 600) canvas.pack(fill='both', expand = True) canvas.create_image(0, 0, image=lobby,anchor = "nw") # 给canvas添加自定义属性持有图片引用,避免被垃圾回收 canvas.lobby_img = lobby canvas.create_text(600, 75, text = '편의시설을 선택해주세요', font='Arial 30') btnCAUburger=Button(mainmenu, padx=3, pady=3, text="카우버거", font="Arial 30 bold") btnTouslesjours=Button(mainmenu, padx=3, pady=3, text="뚜레쥬르", font="Arial 30 bold") btnMorningGlory=Button(mainmenu, padx=3, pady=3, text="모닝글로리", font="Arial 30 bold") btnPostOffice=Button(mainmenu, padx=3, pady=3, text="우체국", font="Arial 30 bold") btnHairNu=Button(mainmenu, padx=3, pady=3, text="헤어누", font="Arial 30 bold") btnSevenEleven=Button(mainmenu, padx=3, pady=3, text="세븐일레븐", font="Arial 30 bold") btnCanon=Button(mainmenu, padx=3, pady=3, text="캐논", font="Arial 30 bold") btn310Ricenoodle=Button(mainmenu, padx=3, pady=3, text="310쌀국수", font="Arial 30 bold") btnCAUburger.place(x=150, y=180) btnTouslesjours.place(x=370, y=180) btnMorningGlory.place(x=590, y=180) btnPostOffice.place(x=850, y=180) btnHairNu.place(x=160, y=360) btnSevenEleven.place(x=350, y=360) btnCanon.place(x=620, y=360) btn310Ricenoodle.place(x=780, y=360)
内容的提问来源于stack exchange,提问作者doruko77
相关产品推荐
相关产品推荐

