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

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()

关键修改点

  1. 将WhatsApp代码中的Tk()改为Toplevel(parent),让子窗口依附于主界面主窗口
  2. 创建PhotoImage时指定master=root,确保图片资源属于子窗口
  3. 给Canvas添加bg属性保存图片引用,防止Python垃圾回收机制回收图片
  4. 主界面提前导入What模块,通过调用start_window函数启动子窗口,避免按钮点击时重复导入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:36:28