python - 创建功能以打包一个小部件并在按下不同键时删除所有其他小部件
问题描述
我正在用 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)
我已确定问题如下:我无法隐藏或显示小部件,除非我按下按钮是它们。
解决方案
您可以做的不是拥有三个小部件,而是在需要时替换同一个小部件的图像。
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()
推荐阅读
- owl-carousel - Owl Carousel 2 - 图片背后的 Spinner Loader
- java - 从 SQLite 数据库中删除前 8 行
- javascript - 单击时更新表行(子组件)进入当前新状态
- java - 为什么正数相乘会产生负值?
- c# - C#'无法将'System.Int32'类型的对象转换为'System.Char'类型。'
- c - 释放整个链表并稍后在 ansi c 中再次填充
- c# - 为什么我不能用新播种的超级用户(Asp.Net Core Identity)登录?
- javascript - Highcharts中的地图不显示印度地图?
- android - 保存用户添加的视图
- amazon-web-services - 如何使用 lambda 函数跨区域复制存储桶内容