我正在构建一个用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
具有fwd
和bwd
的功能是在前进和后退方向上激活电动机。
当我运行脚本时,它会顺利通过循环,但电机不会响应所按住的键。当我添加打印语句时,我注意到这也没有打印到控制台上。
请问有人知道如何进行此操作吗?
答案 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
,因此您的True
和False
子句中的代码将永远不会执行。
因此,只需除去这些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