代码以内联方式执行,但不是在函数中定义并由 python 中的主函数调用时执行的代码



我有一组代码

photo = PhotoImage(file = "computer.png")
label = Label(root, image = photo)
label.pack()

当它在主程序中定义时,它会执行。当它在函数中定义为

def callback():
    photo = PhotoImage(file = "computer.png")
    label = Label(root, image = photo)
    label.pack()
    print ("click!")

然后只有点击!被打印在Python shell上,没有别的。此代码用于在使用 Tkinter 开发的窗口窗体上显示图像

对函数的调用之前是使用菜单命令进行的,但是通过具有相同结果的按钮没有输出

这是内联代码

root = Tk()
root.title('View')
root.geometry('600x400')
photo = PhotoImage(file = "computer.png")
label = Label(root, image = photo)
label.pack() 

这是函数

def callback():
    photo = PhotoImage(file = "computer.png")
    label = Label(root, image = photo)
    label.pack()
    print ("click!")

通过菜单命令调用

viewmenu.add_command(label="1:1 Zoom", command=About)

呼叫通过按钮单击">

b = Button(root, text="OK", command=callback)
b.pack()

预期的结果是在 Tkinter winform 上显示图像,实际结果只是打印点击! 在 Python shell 上

实际上,在内联代码中,照片对象保留在内存中。但是当你调用函数时,由于photo是在函数作用域中定义的变量,所以当函数作业完成时,它会被销毁(它的显示和销毁速度如此之快,以至于你没有注意到它(。在下面的代码中,当photo定义为全局变量时,您将获得所需的结果:

from tkinter import *
def callback():
    global photo
    photo = PhotoImage(file = "computer.png")
    label = Label(root, image = photo)
    label.pack()
    print ("click!")
root = Tk()
b = Button(root, text="OK", command=callback)
b.pack()
root.mainloop()

您还可以将photo定义为root对象的属性:

def callback():
    root.photo = PhotoImage(file = "2.png")
    label = Label(root, image = root.photo)
    label.pack()
    print ("click!")

遵循面向对象的范式使代码的组织更容易。请阅读此答案以获取更多信息。

最新更新