Tkinter多窗口调用报错:image "pyimage1" doesn't exist 求助
问题描述
我用tkinter开发自动化界面,点击按钮导入第二个Python文件时,导入功能能正常执行,但弹出错误提示:image "pyimage1" doesn't exist。试过用tk.Toplevel但没解决问题,求帮助。
主界面代码
import tkinter as tk1 window=tk1.Tk() window.wm_title("Main Interface") def Function(): import What #main Canvas= tk1.Canvas(window, height=1000, width=1000) Canvas.grid(row=30, column=20) Label1=tk1.Label(Canvas, text="WELCOME TO DIGITAL AUTOMATION", bg="#eddea8", font="Verdana 34", relief="solid", borderwidth=5) Label1.grid(row=0, column=1) Label1=tk1.Label(Canvas, text="What do you want to perform ? ", bg="#eddea8", font="Verdana 18", relief="solid", borderwidth=5) Label1.grid(row=1, column=1) Label2=tk1.Label(Canvas, text="Schedule A message ?", bg="#33CCFF", font="Verdana 12") Label2.grid(row=2, column=0) Button1=tk1.Button(Canvas, bg="#59cced", text="Press Here", font="Verdana 18", command=Function) Button1.grid(row=3, column=0) window.mainloop()
WhatsApp自动化功能代码
from tkinter import * import pywhatkit #import pkg_resources.py2_warn root = Tk() root.wm_iconbitmap("icon/default.ico") root.wm_title("Mscheduler") bg = PhotoImage(file = "1187248.png") #root.geometry("965x250") #Function def Function(): n=Entry1.get() m=Entry2.get() L=Entry3.get() I=Entry4.get() y="+91" pywhatkit.sendwhatmsg(y+n,str(m),int(L),int(I)) Entry1.delete(0,END) Entry2.delete(0,END) Entry3.delete(0,END) Entry4.delete(0,END) #def delete(): #Entry1.delete(0,END) #mainscreen Canvas = Canvas(root, height=1000, width=1000) Canvas.grid(row=30, column=20) Canvas.create_image( 0, 0, image = bg, anchor = "nw") Label1 = Label(Canvas, text="Mscheduler",bg='#99e6ff',font="Verdana 34", relief="solid", borderwidth=5) Label1.grid(row=0,column=1) Label2= Label(Canvas, bg="#A9ECFF", text="Phone no:",font="verdana 18") Label2.grid(row=2 , column=0) #Canvas.create_text(105, 115, text="Phone No.:",font="verdana 18") #Canvas.create_text.grid(row=2 , column=0) Entry1=Entry(Canvas,bg="#ffe6b3",font="verdana 18", relief="ridge", borderwidth=3) Entry1.grid(row=2, column=1) Label3= Label(Canvas,bg="#A9ECFF", text=" Message:",font="verdana 18") Label3.grid(row=3 , column=0) #Canvas.create_text(115, 170, text="Message:",font="verdana 18") Entry2=Entry(Canvas,bg="#ffe6b3",font="verdana 18", relief="ridge", borderwidth=3) Entry2.grid(row=3, column=1) Label4= Label(Canvas,bg="#A9ECFF", text=" Hour:",font="verdana 18") Label4.grid(row=4 , column=0) #Canvas.create_text(135, 225, text=" Hour:",font="verdana 18") Entry3=Entry(Canvas,bg="#ffe6b3",font="verdana 18", relief="ridge", borderwidth=3) Entry3.grid(row=4, column=1) Label5= Label(Canvas, bg="#A9ECFF", text=" Minutes:",font="verdana 18") Label5.grid(row=5 , column=0) #Canvas.create_text(135,225 text="Minutes:", font="verdana 18") #Canvas.create_text(200, 350, text="Phone No.:",font="verdana 18") Entry4=Entry(Canvas,bg="#ffe6b3",font="verdana 18", relief="ridge", borderwidth=3) Entry4.grid(row=5, column=1) Button1=Button(Canvas, bg="#d1d1e0", text="send --->", font="verdana 18", borderwidth=3, command=Function) Button1.grid(row=7, column=2) #Button1=Button(Canvas, bg="#d1d1e0", text="delete", font="verdana 18", borderwidth=5, command=delete) #Button1.grid(row=7, column=1) root.mainloop()
问题原因
错误核心是同一个tkinter程序中创建了两个Tk()实例。tkinter要求一个程序只能有一个主窗口(Tk()),主界面已经创建window=tk1.Tk(),WhatsApp代码又创建root=Tk(),导致图片资源被绑定到第一个主窗口,第二个窗口无法访问,触发图片不存在的错误。
解决方案
将WhatsApp代码中的主窗口改为Toplevel子窗口,依附于主界面的主窗口,并调整图片资源的归属逻辑,具体修改如下:
修改后主界面代码
import tkinter as tk1 import What # 提前导入模块,避免重复导入问题 window = tk1.Tk() window.wm_title("Main Interface") def Function(): What.start_window(window) # 调用子窗口启动函数 # main Canvas = tk1.Canvas(window, height=1000, width=1000) Canvas.grid(row=30, column=20) Label1 = tk1.Label(Canvas, text="WELCOME TO DIGITAL AUTOMATION", bg="#eddea8", font="Verdana 34", relief="solid", borderwidth=5) Label1.grid(row=0, column=1) Label1 = tk1.Label(Canvas, text="What do you want to perform ? ", bg="#eddea8", font="Verdana 18", relief="solid", borderwidth=5) Label1.grid(row=1, column=1) Label2 = tk1.Label(Canvas, text="Schedule A message ?", bg="#33CCFF", font="Verdana 12") Label2.grid(row=2, column=0) Button1 = tk1.Button(Canvas, bg="#59cced", text="Press Here", font="Verdana 18", command=Function) Button1.grid(row=3, column=0) window.mainloop()
修改后WhatsApp自动化代码
from tkinter import * import pywhatkit def start_window(parent): # 创建Toplevel子窗口,依附于主窗口 root = Toplevel(parent) root.wm_iconbitmap("icon/default.ico") root.wm_title("Mscheduler") # 指定图片归属为当前子窗口 bg = PhotoImage(file="1187248.png", master=root) def send_message(): n = Entry1.get() m = Entry2.get() L = Entry3.get() I = Entry4.get() y = "+91" pywhatkit.sendwhatmsg(y+n, str(m), int(L), int(I)) Entry1.delete(0, END) Entry2.delete(0, END) Entry3.delete(0, END) Entry4.delete(0, END) # mainscreen Canvas = Canvas(root, height=1000, width=1000) Canvas.grid(row=30, column=20) Canvas.create_image(0, 0, image=bg, anchor="nw") # 保存图片引用,防止被垃圾回收 Canvas.bg = bg Label1 = Label(Canvas, text="Mscheduler", bg='#99e6ff', font="Verdana 34", relief="solid", borderwidth=5) Label1.grid(row=0, column=1) Label2 = Label(Canvas, bg="#A9ECFF", text="Phone no:", font="verdana 18") Label2.grid(row=2, column=0) Entry1 = Entry(Canvas, bg="#ffe6b3", font="verdana 18", relief="ridge", borderwidth=3) Entry1.grid(row=2, column=1) Label3 = Label(Canvas, bg="#A9ECFF", text=" Message:", font="verdana 18") Label3.grid(row=3, column=0) Entry2 = Entry(Canvas, bg="#ffe6b3", font="verdana 18", relief="ridge", borderwidth=3) Entry2.grid(row=3, column=1) Label4 = Label(Canvas, bg="#A9ECFF", text=" Hour:", font="verdana 18") Label4.grid(row=4, column=0) Entry3 = Entry(Canvas, bg="#ffe6b3", font="verdana 18", relief="ridge", borderwidth=3) Entry3.grid(row=4, column=1) Label5 = Label(Canvas, bg="#A9ECFF", text=" Minutes:", font="verdana 18") Label5.grid(row=5, column=0) Entry4 = Entry(Canvas, bg="#ffe6b3", font="verdana 18", relief="ridge", borderwidth=3) Entry4.grid(row=5, column=1) Button1 = Button(Canvas, bg="#d1d1e0", text="send --->", font="verdana 18", borderwidth=3, command=send_message) Button1.grid(row=7, column=2) # 仅直接运行该文件时才创建窗口,避免导入时自动执行 if __name__ == "__main__": root = Tk() start_window(root) root.mainloop()
关键修改点
- 将WhatsApp代码中的
Tk()改为Toplevel(parent),让子窗口依附于主界面主窗口 - 创建
PhotoImage时指定master=root,确保图片资源属于子窗口 - 给Canvas添加
bg属性保存图片引用,防止Python垃圾回收机制回收图片 - 主界面提前导入
What模块,通过调用start_window函数启动子窗口,避免按钮点击时重复导入
内容的提问来源于stack exchange,提问作者Aditya Borkar
相关产品推荐
相关产品推荐

