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

问题描述:

我是Python新手,想知道如何在按下按键时将图像更改为另一个图像。当我按下向下箭头键时,我希望我的图像从GuyUp.gif更改为GuyDown.gif,因此看起来我的人实际上正常行走。我在Python代码如下所示:如何在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语句的“打倒” 谢谢您的帮助键符!

+0

由于您是Python的新手,灌输评论:阅读[PEP 8](http://www.python.org/dev/peps/pep-0008/)。在这种情况下,您的违规行为是在关键字参数周围放置空格;) – Felipe 2013-04-29 23:31:47

首先评论:你已经绑定了所有的按键,所以为什么要在回调中使用所有的条件?只需定义单独的moveup,movedown等功能并将它们绑定到适当的按键。

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

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作为标识符。也许更好的替代方法是在对象本身上使用标签。

+0

感谢您的帮助,但我仍然遇到问题,按下向下箭头键时图像不会改变。你应该将image_id中的图像更改为other_image而不是current_image? – 2013-04-29 23:51:46

+0

对不起!我在通话中错过了一个'image ='。请参阅编辑注意事项 – Felipe 2013-04-30 00:40:08

+0

谢谢!我将继续练习Python并希望创建一个简单的游戏。 :) – 2013-04-30 11:40:40