首页 > 解决方案 > 创建功能以打包一个小部件并在按下不同键时删除所有其他小部件

问题描述

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

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

import tkinter as tk

win = tk.Tk()

def forwards(event):
    print("going forwards...")
def left(event):
    print("turning left...")
def right(event):
    print("turning right...")
def backwards(event):
    print("going backwards...")

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

neutralPosition = tk.Label(win, image=neutralImage)
leftPosition = tk.Label(win, image=leftImage)
rightPosition = tk.Label(win, image=rightImage)

win.bind("w", forwards)
win.bind("a", left)
win.bind("d", right)
win.bind("s", backwards)

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

标签: pythonpython-3.xtkinter

解决方案


您可以做的不是拥有三个小部件,而是在需要时替换同一个小部件的图像。

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()

推荐阅读