如何在Python中按TKinter中的特定键时更改图像

时间:2013-04-29 22:43:30

标签: python

我是Python新手,想知道如何在按下某个键时将图像更改为另一个图像。当我按下向下箭头键,我希望我的图像从GuyUp.gif更改为GuyDown.gif,因此看起来我的家伙实际上正常行走。我在Python中的代码如下所示:

from tkinter import *
tk = Tk()
tk.title("Triangle Movement")
tk.resizable(0, 0)
canvas = Canvas(tk, width=500, height=500)
canvas.pack()
tk.update()
guyup = PhotoImage(file = 'GuyUp.gif')
canvas.create_image(5, 5, image = guyup, anchor = NW)
def movetriangle(event):
    if event.keysym == 'Up':
        canvas.move(1, 0, -4)
    elif event.keysym == 'Down':
        canvas.move(1, 0, 4)
    elif event.keysym == 'Left':
        canvas.move(1, -4, 0)
    elif event.keysym == 'Right':
        canvas.move(1, 4, 0)
    elif event.keysym == 'w':
        canvas.move(2, 0, -4)
    elif event.keysym == 's':
        canvas.move(2, 0, 4)
    elif event.keysym == 'a':
        canvas.move(2, -4, 0)
    else:
        canvas.move(2, 4, 0)
canvas.bind_all('<KeyPress-Up>', movetriangle)
canvas.bind_all('<KeyPress-Down>', movetriangle)
canvas.bind_all('<KeyPress-Left>', movetriangle)
canvas.bind_all('<KeyPress-Right>', movetriangle)
canvas.bind_all('<KeyPress-w>', movetriangle)
canvas.bind_all('<KeyPress-s>', movetriangle)
canvas.bind_all('<KeyPress-a>', movetriangle)
canvas.bind_all('<KeyPress-d>', movetriangle)

我确实有这两张图片,并希望将它放在我的elif语句中,其键入为'Down' 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

首先评论:你已经以不同的方式绑定所有的按键,那么为什么要使用回调中的所有条件?只需定义单独的moveupmovedown等功能,然后将其绑定到相应的按键。

现在,对于图像切换,您需要在应用程序中显示状态,以了解显示哪个图像以及哪个图像不显示。由于您使用的是全局变量而没有使用类,因此您还必须将此信息存储在全局变量中。更改代码的以下部分:

current_image = PhotoImage(file='GuyUp.gif')
image_id = canvas.create_image(5, 5, image=current_image, anchor=NW)
other_image = PhotoImage(file='GuyDown.gif')

并添加以下功能

def swap_images():
    global current_image, other_image, image_id
    x, y = canvas.coords(image_id)
    canvas.delete(image_id)
    image_id = canvas.create_image(x, y, image=other_image)
    current_image, other_image = other_image, current_image

现在,您可以将此功能放在程序逻辑中的任何位置。

你可能最好将你在类中编写的所有内容打包并使用实例变量而不是全局变量,并将函数调整为这种情况留作练习;)


修改:修复了create_image方法中缺少的关键字。

我们还意识到您必须更改canvas.move来电,使用image_id代替1作为标识符。或许存储它的更好的替代方法是在对象本身上使用标记。