Python Tkinter打开新toplevel时图像标签消失

Python Tkinter打开新toplevel时图像标签消失,python,tkinter,python-imaging-library,pmw,Python,Tkinter,Python Imaging Library,Pmw,我有一个带有图像标签的root窗口,然后我有一个managetoplevel打开(使用相同的图像和函数内部的变量),当它打开时,根目录中的图像不再存在,图像仅显示在新的toplevel上。可能是因为我用的是同一个变量吗?我尝试过更改变量名,但没有成功:(注意,我在这里使用Pmw作为Balloon小部件(工具提示),这个问题可能与它有关,尽管我不这么认为 以下是最大值的代码: 在root窗口中: # Creating ? icons q_mark = Image.open('Image/quest

我有一个带有图像标签的
root
窗口,然后我有一个
manage
toplevel打开(使用相同的图像和函数内部的变量),当它打开时,根目录中的图像不再存在,图像仅显示在新的toplevel上。可能是因为我用的是同一个变量吗?我尝试过更改变量名,但没有成功:(注意,我在这里使用
Pmw
作为
Balloon
小部件(工具提示),这个问题可能与它有关,尽管我不这么认为

以下是最大值的代码:

root
窗口中:

# Creating ? icons
q_mark = Image.open('Image/question_mark.png')
q_mark_re = q_mark.resize((15, 15), Image.ANTIALIAS)
q_mark_new = ImageTk.PhotoImage(q_mark_re)

# Making 2 ? icons
q_mark_1 = Label(root, image=q_mark_new)
q_mark_1.grid(row=0, column=2, padx=(0, 10))
q_mark_2 = Label(root, image=q_mark_new)
q_mark_2.grid(row=1, column=2, padx=(0, 10))

# Creating a tooltip for each ? icon
nametooltip_1 = Pmw.Balloon(root)
nametooltip_1.bind(q_mark_1, 'Name:\nEnter a valid full name')
nametooltip_2 = Pmw.Balloon(root)
nametooltip_2.bind(q_mark_2, 'Phone Number:\nEnter a phone number less than 11 digits')
管理
顶层:

def manage():
    global q_mark_new

    # Defining Login window
    admin = Toplevel(root)
    admin.title('Login')
    admin.focus_force()
.....
    # Creating ? icons
    q_mark = Image.open('Image/question_mark.png')
    q_mark_re = q_mark.resize((15, 15), Image.ANTIALIAS)
    q_mark_new = ImageTk.PhotoImage(q_mark_re)

    # Making 13 ? icons
    q_mark_1 = Label(admin, image=q_mark_new)
    q_mark_2 = Label(admin, image=q_mark_new)
    q_mark_1.grid(row=2, column=1, padx=(5, 130))
    q_mark_2.grid(row=4, column=1, padx=(5, 130))

    nametooltip_1 = Pmw.Balloon(root)
    nametooltip_2 = Pmw.Balloon(root)
    nametooltip_1.bind(q_mark_1, 'Username:\nEnter the given username')
    nametooltip_2.bind(q_mark_1, 'Password:\nEnter the given correct password')
现在我在
manange
窗口中获得图像,但在
root
窗口中不再获得图像

之前(注意输入框侧面的q_标记):

After(注意它在
root
窗口中消失,在
manage
窗口中出现:


提前感谢:D

为您最初创建的
q_mark
指定一个名称,不要再创建它

q_mark = Image.open('Image/question_mark.png')
q_mark_re = q_mark.resize((15, 15), Image.ANTIALIAS)
q_mark_new = ImageTk.PhotoImage(q_mark_re, name="qmark")
在要使用图像的任何位置使用该名称

def manage():
    #don't need this
    #global q_mark_new

    # Defining Login window
    admin = Toplevel(root)
    admin.title('Login')
    admin.focus_force()
.....
    # Creating ? icons ~ DON'T DO THIS
    #q_mark = Image.open('Image/question_mark.png')
    #q_mark_re = q_mark.resize((15, 15), Image.ANTIALIAS)
    #q_mark_new = ImageTk.PhotoImage(q_mark_re)

    # Making 13 ? icons
    q_mark_1 = Label(admin, image="qmark")
    q_mark_2 = Label(admin, image="qmark")
    q_mark_1.grid(row=2, column=1, padx=(5, 130))
    q_mark_2.grid(row=4, column=1, padx=(5, 130))

    nametooltip_1 = Pmw.Balloon(root)
    nametooltip_2 = Pmw.Balloon(root)
    nametooltip_1.bind(q_mark_1, 'Username:\nEnter the given username')
    nametooltip_2.bind(q_mark_1, 'Password:\nEnter the given correct password')

尽量为您的图像保留一个引用。@jizhaosama最好的方法是什么?您不需要在
manage()中重新创建图像
q\u mark\u new
,只需直接使用它。因为您在根和顶级中对映像使用了相同的变量,所以前一个映像将被垃圾收集,因为没有对它的变量引用。如果它是在主块中定义的(即不在类和函数内部),它在全局范围内。因此可以在函数内访问它。但请注意,如果在函数内使用它之前,使用
=
为它分配了新值,则会创建一个同名的局部变量,除非使用
全局
语句将其声明为全局变量。