解释按住键

时间:2018-08-09 19:39:42

标签: python pygame keypress

我正在构建一个用Python编写的Raspberry Pi流动站,我希望通过SSH控制流动站。因此,我将运行脚本,然后希望流动站按照我提供的方向实时移动,例如RC车(想想向上键,向下键,向左键,向右键)。

我在线阅读了其中一种可能是使用pygame.key.get_pressed()函数,但这在我的Shell中不起作用。当我在raspberry pi python shell中运行该命令时,我只收到零元组,这些元组在一秒之内就会超时。

我的代码如下:

speed = input('How fast do you want the rover to go? Give a value lower than 1: ')

while True:
    keys = pygame.key.get_pressed()  #checking pressed keys
    if keys == True:
        if keys[pygame.K_UP]:
            fwd(speed)
        if keys[pygame.K_DOWN]:
            bwd(speed)
    if keys == False:
        MS.motor1off
        MS.motor2off     

具有fwdbwd的功能是在前进和后退方向上激活电动机。

当我运行脚本时,它会顺利通过循环,但电机不会响应所按住的键。当我添加打印语句时,我注意到这也没有打印到控制台上。

请问有人知道如何进行此操作吗?

3 个答案:

答案 0 :(得分:2)

我不是pygame专家,并且从未使用过key.get_pressed()方法。我使用event.get()效果很好。这是我使用的代码的最小示例:

import pygame

pygame.init()

WINDOW_WIDTH = 250
WINDOW_HEIGHT = 120

pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

while True:
    for event in pygame.event.get():        
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                print('works!')

您必须确保初始化pygame并创建一个窗口,并且该窗口必须位于焦点上。然后它将起作用。如果这对您不方便,那么无论焦点在哪个窗口上,您都必须加入键盘的keypress事件,以便获得全局的keypress。

希望这会有所帮助。

答案 1 :(得分:2)

pygame.key.get_pressed()返回表示键状态的布尔值列表。列表永远不能等于//MyNamespace/index.js import Mod1 from './Mod1' //assumes ./Mod1.js import Mod2 from './Mod2' //assumes ./Mod2.js export{ Mod1, Mod2 } //SomeOtherFile.js import * as NamespaceToUse from './MyNamespace' // Then access as: NamespaceToUse.Mod1 NamespaceToUse.Mod2 ,因此您的TrueFalse子句中的代码将永远不会执行。

因此,只需除去这些if keys == True:子句,并在if keys == False:后使用if子句或同时使用这两个语句来关闭电动机(不确定要执行的操作)。 / p>

else

顺便说一句,如果if keys[pygame.K_UP]:while True: # You must make a call to the event queue every frame or the window will "freeze". pygame.event.pump() keys = pygame.key.get_pressed() if keys[pygame.K_UP]: fwd(speed) elif keys[pygame.K_DOWN]: bwd(speed) else: # No key pressed. MS.motor1off MS.motor2off 是方法,则可能要调用它们:motor1off

答案 2 :(得分:0)

@WurzelseppQX 代码中,我编写了一个新代码,只要按住该按钮即可打印文本,并且在释放按钮时将停止打印。这是代码:

import pygame  #importing pygame

pygame.init() #initializing pygame

width = 100 # width of window
height = 100 #height of window

pygame.display.set_mode((width, height)) # setting dimensions

while True:
    tbreak = False # to break two loops
    for event in pygame.event.get():   #getting events     
        if event.type == pygame.KEYDOWN: #see if a button is pressed
            if event.key == pygame.K_w: # if button is 'W' then
                while True: # making loop
                    print("Key 'W' pressed") 
                    ev = pygame.event.get() #getting events to see if the user just released the key
                    for e in ev: #looping the events
                        if e.type == pygame.KEYUP: #if any key is released
                            #You can also set specific keys
                            tbreak = True #to break the outerloop
                            break #breaking the inner loop
                    if tbreak == True:break #breaking

现在,当按下按钮时,上面的代码将阻止游戏的其余部分。如果您不希望自己的代码执行此操作,请使用以下代码:

global topass
topass = 0
def on_press(): #what to do on button press
    global topass
    print("Key 'W' pressed")
    topass = 1
while True:
    events = pygame.event.get()
    if len(events) == 0 and topass == 1:on_press()
    for event in events:
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w or topass == 1:
                on_press()
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_w:
                topass = 0