Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过SSH的Pygame不注册击键(Raspberry Pi 3)_Python_Ssh_Raspberry Pi_Pygame_Led - Fatal编程技术网

Python 通过SSH的Pygame不注册击键(Raspberry Pi 3)

Python 通过SSH的Pygame不注册击键(Raspberry Pi 3),python,ssh,raspberry-pi,pygame,led,Python,Ssh,Raspberry Pi,Pygame,Led,所以我得到了raspi 3和简单的8x8 LED矩阵。玩了一段时间后,我决定用pygame的事件制作一个简单的蛇游戏(显示在矩阵上),我以前没有pygame的经验。除led矩阵外,没有连接屏幕/显示器 最初的问题是“pygame.error:video system not initialized”,不过我想我通过设置一个env变量解决了这个问题: os.putenv('DISPLAY',':0.0') 现在我让它工作了,我运行它…什么都没有发生,就像没有按键注册一样。LED矩阵上的点不移动。如

所以我得到了raspi 3和简单的8x8 LED矩阵。玩了一段时间后,我决定用pygame的事件制作一个简单的蛇游戏(显示在矩阵上),我以前没有pygame的经验。除led矩阵外,没有连接屏幕/显示器

最初的问题是“pygame.error:video system not initialized”,不过我想我通过设置一个env变量解决了这个问题:
os.putenv('DISPLAY',':0.0')
现在我让它工作了,我运行它…什么都没有发生,就像没有按键注册一样。LED矩阵上的点不移动。如果我改变蛇在循环中某处的x或y位置,它会按预期移动

我的代码:

#!/usr/bin/python2
import pygame
import max7219.led as led
from max7219.font import proportional, SINCLAIR_FONT, TINY_FONT, CP437_FONT
import numpy as nqp
import os

SIZE = (8, 8)

class Board:
    def __init__(self, size, snake):
        "Board object for snake game"
        self.matrix = np.zeros(size, dtype=np.int8)
        self.device = led.matrix()
        self.snake = snake
    def draw(self):
        #add snake
        self.matrix = np.zeros(SIZE, dtype=np.int8)
        self.matrix[self.snake.x][self.snake.y] = 1
        for x in range(8):
            for y in range(8):
                self.device.pixel(x, y, self.matrix[x][y], redraw=False)
        self.device.flush()
    def light(self, x, y):
        "light specified pixel"
        self.matrix[x][y] = 1
    def dim(self, x, y):
        "off specified pixel"
        self.matrix[x][y] = 0

class Snake:
    def __init__(self):
        "Object representing an ingame snake"
        self.length = 1
        self.x = 3
        self.y = 3

if __name__=="__main__":
    os.putenv('DISPLAY', ':0.0')
    pygame.init()
    snake = Snake()
    board = Board(SIZE, snake)
    done = False
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    snake.y -= 1
                elif event.key == pygame.K_DOWN:
                    snake.y += 1
                elif event.key == pygame.K_LEFT:
                    snake.x -= 1
                elif event.key == pygame.K_RIGHT:
                    snake.x += 1
        board.draw()

我使用pygame是因为我不知道其他任何东西(我也不能使用pygame,但我不知道还有其他选择)。如果可以做得更简单,我会很乐意做的。提前谢谢你

你应该能够使用诅咒。下面是一个简单的例子:

import curses


def main(screen):
    key = ''
    while key != 'q':
        key = screen.getkey()
        screen.addstr(0, 0, 'key: {:<10}'.format(key))


if __name__ == '__main__':
    curses.wrapper(main)
在您的场景中,您可能会将其放在您的游戏循环中,该循环将延伸至8x8显示器,因此它看起来像这样:

 game = SnakeGame()
 while game.not_done:
     try:
         key = screen.getkey()
     except curses.error:
         key = None

     if key == 'KEY_UP':
         game.turn_up()
     elif key == 'KEY_DOWN':
         game.turn_down()
     elif key == 'KEY_LEFT':
         game.turn_left()
     elif key == 'KEY_RIGHT':
         game.turn_right()

     game.tick()

需要注意的一点是,这种方法将占用您100%的CPU,因此,如果您没有其他方法限制应用程序的运行,可能会导致一些问题。如果您发现这是您需要的,您可以使用线程/多处理来扩展此方法。

看起来您正在使用PuTTY?查看并了解如何以这种方式设置X11转发。
 game = SnakeGame()
 while game.not_done:
     try:
         key = screen.getkey()
     except curses.error:
         key = None

     if key == 'KEY_UP':
         game.turn_up()
     elif key == 'KEY_DOWN':
         game.turn_down()
     elif key == 'KEY_LEFT':
         game.turn_left()
     elif key == 'KEY_RIGHT':
         game.turn_right()

     game.tick()