我有以下代码,

如果我按“左箭头键”,它只会打印 move player to left但我需要一个功能,在这个功能中,按下给定的箭头键可以让玩家朝给定的方向移动。

有没有办法在我的 move_dir 函数中检测按键事件

PS:对python相当陌生

import Tkinter as tk

move = 1
pos = -1


def move_dir():
    global move
    global pos
    while move ==1:
        if pos == 0:
            print 'move player to left'

        elif pos == 1:
            print 'move player to right'

        elif pos == -1:
            print 'stop moving!'

def kr(event):
    global move
    global pos
    global root
    if event.keysym == 'Right':
        move = 1
        pos = 0
        move_dir()
        print 'right ended'
    elif event.keysym == 'Left':
        move = 1
        pos = 1
        move_dir()
        print 'left ended'
    elif event.keysym == 'Space':
        move = 0
        move_dir()
    elif event.keysym == 'Escape':
        root.destroy()

root = tk.Tk()
print( "Press arrow key (Escape key to exit):" )
root.bind_all('<KeyRelease>', kr)
root.mainloop()

最佳答案

编辑 4

您有一个想要与 Tkinter 主循环结合的 while 循环。
在这种情况下,您希望在按下键时移动并在松开键时停止移动。
下面的代码允许您执行此操作:

import Tkinter as tk
from guiLoop import guiLoop # https://gist.github.com/niccokunzmann/8673951#file-guiloop-py

direction = 0
pos = 0 # the position should increase and decrease depending on left and right
# I assume pos can be ... -3 -2 -1 0 1 2 3 ...

@guiLoop
def move_dir():
    global pos
    while True: # edit 1: now looping always
        print 'moving', direction
        pos = pos + direction
        yield 0.5 # move once every 0.5 seconds

def kp(event):
    global direction # edit 2
    if event.keysym == 'Right':
        direction  = 1 # right is positive
    elif event.keysym == 'Left':
        direction = -1
    elif event.keysym == 'Space':
        direction = 0 # 0 is do not move
    elif event.keysym == 'Escape':
        root.destroy()

def kr(event):
    global direction
    direction = 0

root = tk.Tk()
print( "Press arrow key (Escape key to exit):" )
root.bind_all('<KeyPress>', kp)
root.bind_all('<KeyRelease>', kr)
move_dir(root)
root.mainloop()

要了解这是如何实现的,您可以阅读源代码或阅读 Bryan Oakley 的第二个答案。

编辑 3

无法直接在 move_dir 函数中检测按键。
您可以在 root.update() 函数中使用 move_dir ,以便在调用 kr 时执行 kproot.updateroot.update() 还会重新绘制窗口,以便用户可以看到更改。
root.mainloop() 可以看做 while True: root.update()

关于python - Tkinter 从函数中获取按键事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21440731/

10-12 22:52