Tkinter图像没有';t显示Python 3.8 Windows 10

Tkinter图像没有';t显示Python 3.8 Windows 10,python,image,tkinter,Python,Image,Tkinter,由于某种原因,当我运行程序时,图像不会显示。我只得到一个灰色的框,运行时没有错误。我想要的是,当用户点击上传按钮时,第二个窗口将打开,询问他们的电子邮件地址和密码。我想要的灰显位置的文件是一个徽标(在电子邮件请求上方)。文件cats.jfif与我的程序位于同一文件夹中。最后,我想添加一个png图像(不知道这是否重要)。输出的代码和图像如下: import tkinter as tk from tkinter import ttk import tkinter.font as tkFont fro

由于某种原因,当我运行程序时,图像不会显示。我只得到一个灰色的框,运行时没有错误。我想要的是,当用户点击上传按钮时,第二个窗口将打开,询问他们的电子邮件地址和密码。我想要的灰显位置的文件是一个徽标(在电子邮件请求上方)。文件cats.jfif与我的程序位于同一文件夹中。最后,我想添加一个png图像(不知道这是否重要)。输出的代码和图像如下:

import tkinter as tk
from tkinter import ttk
import tkinter.font as tkFont
from PIL import ImageTk
from PIL import Image as PilImage

class Other:
    def __init__(self,master):
        self.width = 300
        self.height = 500
        master.geometry(f"{self.width}x{self.height}")
        self.frame = tk.Frame(master,bg="white")
        self.frame.place(relx=0, rely=0, relwidth=1, relheight=1)
        self.font = ('Helvetica', '10')
        self.uploadButton = tk.Button(self.frame, text="Upload", bg="orange", fg="white", font=self.font,
                                command = self.Upload)
        self.uploadButton.place(relx=0.001, rely=0.865, relwidth=0.999, relheight=0.13)

    def Upload(self):
        #HAVE TO CHECK IF FILE EXISTS IN THE FOLDER
        #f"{self.date}_iProdi.xlsx"
        login = tk.Toplevel()
        login.geometry("300x500")
        self.frame2 = tk.Frame(login, bg = "white")
        self.frame2.place(relx=0, rely=0, relwidth=1, relheight=1)
        img = ImageTk.PhotoImage(PilImage.open("cats.jfif"))
        self.panel = tk.Label(self.frame2, image = img)
        self.panel.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.2)

        #Employee username
        self.emailLabel = tk.Label(self.frame2, text="Email:", font=self.font, bg="white", anchor="e")
        self.emailLabel.place(relx=0.1, rely=0.4, relwidth=0.25, relheight=0.08)
        self.emailEntry = tk.Entry(self.frame2, font=self.font, bg="white")
        self.emailEntry.place(relx=0.37, rely=0.4, relwidth=0.4, relheight=0.06)

        #Employee Password
        self.passwordLabel = tk.Label(self.frame2, text="Password:", font=self.font, bg="white", anchor="e")
        self.passwordLabel.place(relx=0.1, rely=0.56, relwidth=0.25, relheight=0.08)
        self.passwordEntry = tk.Entry(self.frame2, font=self.font, bg="white", show="*")
        self.passwordEntry.place(relx=0.37, rely=0.56, relwidth=0.4, relheight=0.06)



root = tk.Tk()
other = Other(root)
root.mainloop()
找到了解决方案

显然,tkinter会破坏图像,因此您需要自己保留图像的引用。

找到了解决方案


显然,tkinter会破坏图像,因此您需要自己保留图像的引用。

在tkinter中,加载图像时出现问题。 当您尝试加载图像时,必须确保存储加载图像的变量不会被破坏,否则图像也会在tkinter中被破坏

在您的代码中,您正在将图像加载到
img
局部变量中,该变量在执行
方法
后会被“destroed”,因此您的图像会被删除

在这种情况下,要保存图像引用,只需在变量名之前添加
self.
,即可将变量保存为类变量并防止其树折叠

self.img = ImageTk.PhotoImage(PilImage.open("4.jpg"))
self.panel = tk.Label(self.frame2, image = self.img)
常见用法是将图像引用存储在数组中


是一个类似的问题

在tkinter中,加载图像有问题。 当您尝试加载图像时,必须确保存储加载图像的变量不会被破坏,否则图像也会在tkinter中被破坏

在您的代码中,您正在将图像加载到
img
局部变量中,该变量在执行
方法
后会被“destroed”,因此您的图像会被删除

在这种情况下,要保存图像引用,只需在变量名之前添加
self.
,即可将变量保存为类变量并防止其树折叠

self.img = ImageTk.PhotoImage(PilImage.open("4.jpg"))
self.panel = tk.Label(self.frame2, image = self.img)
常见用法是将图像引用存储在数组中


是一个类似的问题

img=ImageTk.PhotoImage(…)
更改为
self.img=…
。类似的问题已经被问了很多次。将
img=ImageTk.PhotoImage(…)
更改为
self.img=…
。类似的问题已经被问过很多次了。