我在运行Jessie的覆盆子Pi 2上有两个显示器:HDMI显示器(默认)和Adafruit PiTFT液晶显示器。
我可以在两个SSH终端中独立地启动pygame程序,用于两个不同的显示,除了第二个运行暂停直到我点击^C。
在我的Mac上使用SSH,我可以在任意一个上运行“count-to-50”pygame程序。(唯一的区别是LCD版本设置了2个env变量,将pygame重定向到LCD屏幕。)
如果我打开两个SSH终端,并尝试运行这两个python程序,那么第二个程序只有在我按control-C时才开始运行。
我需要做什么不同的事情,使第二个程序开始正常运行,而不必首先按control-C?
我不确定这是不是一个“linux”设备安装问题,一个“python”代码问题?
下面是两个简单的程序:

# count_on_lcd.py
import pygame, time, os
# on raspberry pi this sends to LCD screen
os.environ['SDL_VIDEODRIVER'] = 'fbcon'
os.environ["SDL_FBDEV"] = "/dev/fb1"
pygame.init()
Screen = max(pygame.display.list_modes())
Surface = pygame.display.set_mode(Screen)
Surface.fill(pygame.Color(0,0,0))
pygame.display.update()
font_big = pygame.font.Font(None, 150)
for i in range(50):
  print (i)
  Surface.fill(pygame.Color(128,0,0))
  text_surface = font_big.render('%s'%i, True, (255,255,255))
  rect = text_surface.get_rect(center=(50,50))
  Surface.blit(text_surface, rect)
  pygame.display.update()
  time.sleep(1)
  Surface.fill(pygame.Color(0,128,0))
  pygame.display.update()
  time.sleep(1)


#count_on_hdmi.py
import pygame, time
# on raspberry pi the HDMI screne is default
pygame.init()
Screen = max(pygame.display.list_modes())
Surface = pygame.display.set_mode(Screen)
Surface.fill(pygame.Color(0,0,0))
pygame.display.update()
font_big = pygame.font.Font(None, 150)
for i in range(50):
  print (i)
  Surface.fill(pygame.Color(128,0,0))
  text_surface = font_big.render('%s'%i, True, (255,255,255))
  rect = text_surface.get_rect(center=(50,50))
  Surface.blit(text_surface, rect)
  pygame.display.update()
  time.sleep(1)
  Surface.fill(pygame.Color(0,128,0))
  pygame.display.update()
  time.sleep(1)

在我的Mac上,我打开了两个到树莓Pi的SSH终端。
在第一个SSH终端中:
$ sudo python count_on_lcd.py
(starts running normally)

在第二个SSH终端中:
$ sudo python count_on_hdmi.py
(Pauses until I type ^C)

不管我按什么顺序启动这两个程序,它都会做同样的事情。。。我调用的第一个命令总是立即运行,我调用的第二个命令在开始运行之前还需要^C。

最佳答案

如果itls已经在一个单独的SSH终端上运行,那么pygame.init()可能会出现问题。
我找到了解决办法。虽然不漂亮,但很管用。
仅在pygame requires keyboard interrupt to init display

from signal import alarm, signal, SIGALRM, SIGKILL

def init_Pygame(surf):

    # this section is an unbelievable nasty hack - for some reason Pygame
    # needs a keyboardinterrupt to initialise in some limited circs (second time running)
    class Alarm(Exception):
        pass

    def alarm_handler(signum, frame):
        raise Alarm

    signal(SIGALRM, alarm_handler)
    alarm(3)
    print("Step 2 ")
    try:
        pygame.init()
        Screen = max(pygame.display.list_modes())
        surf = pygame.display.set_mode(Screen)
        alarm(0)
    except Alarm:
        raise KeyboardInterrupt
    return (surf)

关于python - 在第二个SSH终端中运行第二个pygame程序(用于第二个显示)会暂停,直到按下^ C为止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34981542/

10-12 14:27