绑定键,以便我可以同时按下它们

时间:2013-12-19 09:43:40

标签: python tkinter key-bindings

N.B。这不是所有代码。我真正想做的是绑定玩家1键(wasd)和玩家2键(向上,向下,向右,向左),这样我就可以同时按下它们,因此可以分别控制两个玩家但同时控制玩家(玩家2不在代码)) 所以这是我目前的代码:

    def p1_move_N(self):
    global p1_y
    canvas.create_line(p1_x, p1_y, p1_x, (p1_y-line_length), width=line_width, fill=p1_colour)
    p1_y = p1_y - line_length

def p1_move_S(self):
    global p1_y
    canvas.create_line(p1_x, p1_y, p1_x, p1_y+line_length, width=line_width, fill=p1_colour)
    p1_y = p1_y + line_length

def p1_move_E(self):
    global p1_x
    canvas.create_line(p1_x, p1_y, p1_x + line_length, p1_y, width=line_width, fill=p1_colour)
    p1_x = p1_x + line_length

def p1_move_W(self):
    global p1_x
    canvas.create_line(p1_x, p1_y, p1_x - line_length, p1_y, width=line_width, fill=p1_colour)
    p1_x = p1_x - line_length

p1_press = None # which key is the player holding down?

def change_press(key, up_down):
    if up_down == "up":
        p1_press=None
    else:
        p1_press=key.keysym


while(True):
    print(p1_press)

window.bind("<KeyPress-w>", change_press('down'))
window.bind("<KeyPress-s>", change_press('down'))
window.bind("<KeyPress-a>", change_press('down'))
window.bind("<KeyPress-d>", change_press('down'))
window.bind("<KeyRelease-w>", change_press('up'))
window.bind("<KeyRelease-s>", change_press('up'))
window.bind("<KeyRelease-a>", change_press('up'))
window.bind("<KeyRelease-d>", change_press('up'))

我已经开始这样做,但我似乎无法调试我的所有代码抛回的事实:(当按下'w'键时)

    None
    Nonew
    wNone
    None
    Nonew

这是来自循环

它应该返回:

None
w
None
None
w
None

非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:1)

执行此操作时:window.bind("<KeyPress-w>", change_press('down')),tkinter将调用函数change_press('down'),而返回的任何内容都与绑定相关联。换句话说,您在初始化时调用该函数,而不是每次按下该键时调用该函数。

一个简单的修改是将绑定更改为:

window.bind("<KeyPress-w>", lambda event: change_press('down'))

lambda将创建一个新的匿名函数,该函数将事件作为参数(由Tkinter在调用绑定函数时提供)。这个新功能将与绑定相关联。然后,当绑定触发时,它将调用change_press函数。

此外,这个语句集将永远运行,阻止您的GUI出现:

while(True):
    print(p1_press)

您需要删除该代码。