Python, Tkinter, 销毁图像的函数(多个参数)

-1 投票
1 回答
972 浏览
提问于 2025-04-19 15:35

我在用Tkinter做一个程序,基本上我想把窗口上放的所有图片都去掉。因为我创建的这个函数(或者说我尝试创建的 :P)是用来清空窗口的,所以我需要它能从程序的任何地方删除我想要的东西。

这个窗口上有两张图片,分别是img和img1。在5000秒后?(这个我也不太确定,但还没去看那部分)计时器会结束,然后调用这个函数。不过我好像把这个函数写错了。

你可以看到,我尝试使用(*A),但这似乎只是用于打印字符串之类的,并不识别.destroy()。我还尝试把函数写成这样:

def removewidgets(A)(B)(C)(D):
    A.destroy()
    B.destroy()
    C.destroy()
    D.destroy()
    return; 

但我觉得这个方法很糟糕,而且反正也没用哈哈。真的希望有人能帮我解决这个问题,非常感谢!

这是代码。

import sys
from tkinter import *
from PIL import Image, ImageTk
#______________________________________________________________________________________
SWH = Tk()
SWH.geometry("1024x950+130+0")
SWH.title("ServiceWhiz.")
#_______________________________________________________________#GlobalFunctions#______
#ClearAllWidgets
def removewidgets(*A):
    A.destroy()
    return;
#_______________________________________________________________#LoadingPage#__________
load = Image.open("Logo.png")
render = ImageTk.PhotoImage(load)
img = Label(SWH,image=render)
img.image = render  
img.place(x=458,y=250)

load = Image.open("PoweredByServiceWhiz.png")
render = ImageTk.PhotoImage(load)
img1 = Label(SWH,image=render)
img1.image = render  
img1.place(x=362,y=612.5)

img.after(5000, removewidgets(img, img1))

相关问题:

1 个回答

2

首先,当你在给变量编号的时候,应该换个方式,这里可以用一个列表,这样你只需要把这个列表传给函数就行了。在函数里,你可以遍历这个列表中的每一项,然后对每一项调用 destroy。如果你能为图形界面(GUI)创建一个类,那就更简单了。

问题在于你是在 img.after 参数里面调用了 removewidgets 函数。因为所有可以调用的参数都会被执行,并且它们的返回值会被使用,所以你调用这个事件时返回的是 None

可以用下面这种方式来替代:

img.after(5000, lambda: removewidgets(img, img1))

lambda 是用来创建一个匿名函数的,这样你就可以把这个 函数对象 作为参数使用。

顺便说一下,你不需要写 return;。如果没有指定 return,函数默认会返回 None

撰写回答