Python 创建函数,以便在按下不同键时打包一个小部件并删除所有其他小部件

Python 创建函数,以便在按下不同键时打包一个小部件并删除所有其他小部件,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在用Python为一辆汽车制作一个控制器,我将有3个单独的图像来表示车轮是向左、向右还是空档。我一次只需要显示其中一个图像 到目前为止,我已经使用了bind-to-trigger函数,因为我还没有看到任何其他方法。我已经查看了pack和pack_-forget,但我不知道如何触发它们被其他小部件激活(因为我正在使用bind) 我发现问题如下:我无法隐藏或显示小部件,除非我按下按钮的是它们。与其有三个小部件,不如在需要时替换同一个小部件的图像 import tkinter as tk def

我正在用Python为一辆汽车制作一个控制器,我将有3个单独的图像来表示车轮是向左、向右还是空档。我一次只需要显示其中一个图像

到目前为止,我已经使用了bind-to-trigger函数,因为我还没有看到任何其他方法。我已经查看了pack和pack_-forget,但我不知道如何触发它们被其他小部件激活(因为我正在使用bind)


我发现问题如下:我无法隐藏或显示小部件,除非我按下按钮的是它们。

与其有三个小部件,不如在需要时替换同一个小部件的图像

import tkinter as tk

def changeImage(imageLabelWidget, newImage):
    imageLabelWidget.configure(image=newImage)
    imageLabelWidget.image = newImage

win = tk.Tk()
neutralImage = tk.PhotoImage(file="neutral.gif")
leftImage = tk.PhotoImage(file="turnedLeft.gif")
rightImage = tk.PhotoImage(file="turnedRight.gif")


neutralPosition = tk.Label(win, image=neutralImage)
neutralPosition.image = neutralImage
neutralPosition.pack()


win.bind("w", lambda event, imageLabelWidget=neutralPosition, newImage=neutralImage: 
                            changeImage(imageLabelWidget, newImage))
win.bind("a", lambda event, imageLabelWidget=neutralPosition, newImage=leftImage: 
                            changeImage(imageLabelWidget, newImage))
win.bind("d", lambda event, imageLabelWidget=neutralPosition, newImage=rightImage: 
                            changeImage(imageLabelWidget, newImage))

win.mainloop()

嘿,伙计,非常感谢你为我写了这么多代码。但是,当我尝试运行它时,我得到了AttributeError:“Label”对象没有属性“image”。我对Python真的是个新手,我不知道如何修复它。你能解释一下吗?事实上,我已经研究代码一段时间了,但我仍然不知道这里发生了什么。你是对的,我在一个属性中有错误。请再次查看我的答案,我已经编辑并测试了它。当然没有问题,我们使用changeImage函数所做的是更改标签小部件具有的图像属性:
imageLabelWidget.configure(image=newImage)
,然后我们所做的是再次将图像分配给该属性,我们必须这样做,因为如果不是这样,python垃圾收集器将删除映像,我们将只看到一个空格(在tk和tcl的旧版本中会出现这种情况)。然后,使用绑定所做的是添加更改映像的函数,只使用lambda来传递参数,否则,正如您在文章中所说的,我们不能这样做,在这种情况下,如果您以这种方式将代码更改为类,那么您可以保存参数,图像和小部件都可以成为类的属性。
import tkinter as tk

def changeImage(imageLabelWidget, newImage):
    imageLabelWidget.configure(image=newImage)
    imageLabelWidget.image = newImage

win = tk.Tk()
neutralImage = tk.PhotoImage(file="neutral.gif")
leftImage = tk.PhotoImage(file="turnedLeft.gif")
rightImage = tk.PhotoImage(file="turnedRight.gif")


neutralPosition = tk.Label(win, image=neutralImage)
neutralPosition.image = neutralImage
neutralPosition.pack()


win.bind("w", lambda event, imageLabelWidget=neutralPosition, newImage=neutralImage: 
                            changeImage(imageLabelWidget, newImage))
win.bind("a", lambda event, imageLabelWidget=neutralPosition, newImage=leftImage: 
                            changeImage(imageLabelWidget, newImage))
win.bind("d", lambda event, imageLabelWidget=neutralPosition, newImage=rightImage: 
                            changeImage(imageLabelWidget, newImage))

win.mainloop()