Python 2.7 pygame初始化帧缓冲区或x服务器

Python 2.7 pygame初始化帧缓冲区或x服务器,python-2.7,pygame,framebuffer,Python 2.7,Pygame,Framebuffer,我有一个类来检查合适的帧缓冲区,它工作得很好。一对计算机(大部分是嵌入式旧板)没有帧缓冲区,因此我删除了init(self):函数,并手动将其设置为在X下运行。这两种方法都适用于各自的系统,我只是厌倦了每次更改时移植它 以下是工作帧缓冲区代码: class wxdisplay : screen = None; def __init__(self): "Ininitializes a new pygame screen using

我有一个类来检查合适的帧缓冲区,它工作得很好。一对计算机(大部分是嵌入式旧板)没有帧缓冲区,因此我删除了init(self):函数,并手动将其设置为在X下运行。这两种方法都适用于各自的系统,我只是厌倦了每次更改时移植它

以下是工作帧缓冲区代码:

    class wxdisplay :
        screen = None;

        def __init__(self):
            "Ininitializes a new pygame screen using the framebuffer"
            # Based on "Python GUI in Linux frame buffer"
            # http://www.karoltomala.com/blog/?p=679
            disp_no = os.getenv("DISPLAY")
            if disp_no:
                print "I'm running under X display = {0}".format(disp_no)

            # Check which frame buffer drivers are available
            # Start with fbcon since directfb hangs with composite output
            drivers = ['fbcon', 'directfb', 'svgalib']
            found = False
            for driver in drivers:
                # Make sure that SDL_VIDEODRIVER is set
                if not os.getenv('SDL_VIDEODRIVER'):
                    os.putenv('SDL_VIDEODRIVER', driver)
                try:
                    pygame.display.init()
                except pygame.error:
                    print 'Driver: {0} failed.'.format(driver)
                    continue
                found = True
                break

            if not found:
                raise Exception('No suitable video driver found!')

            size = (pygame.display.Info().current_w, pygame.display.Info().current_h)
            print "Framebuffer size: %d x %d" % (size[0], size[1])
            self.screen = pygame.display.set_mode(size, pygame.FULLSCREEN)class wxdisplay :
以下是非帧缓冲版本:

    class wxdisplay :
        pygame.init()
        size = (1024, 768)
        screen = pygame.display.set_mode(size)
        print "Framebuffer size: %d x %d" % (size[0], size[1])
我想尝试初始化帧缓冲区,如果失败,尝试在控制台上运行它。我尝试过的每一件事,如果尝试过的或例外的都失败了

    class wxdisplay :
        def __init__(self):
                    # Try to use framebuffer, and use the local X server if not there
                    try:
                            screen = None;
                            "Ininitializes a new pygame screen using the framebuffer"
                            # Based on "Python GUI in Linux frame buffer"
                            # http://www.karoltomala.com/blog/?p=679
                            disp_no = os.getenv("DISPLAY")
                            print("disp_no " +disp_no)
                            if disp_no:
                                    print "I'm running under X display = {0}".format(disp_no)

                            # Check which frame buffer drivers are available
                            # Start with fbcon since directfb hangs with composite output
                            drivers = ['fbcon', 'directfb', 'svgalib', 'xvfb', 'Xvfb']
                            found = False
                            for driver in drivers:
                                    # Make sure that SDL_VIDEODRIVER is set
                                    if not os.getenv('SDL_VIDEODRIVER'):
                                            os.putenv('SDL_VIDEODRIVER', driver)
                                    try:
                                            print("Driver: "+driver)
                                            pygame.display.init()
                                    except pygame.error:
                                            print 'Driver: {0} failed.'.format(driver)
                                            continue
                                    found = True
                                    print("break")
                                    break


                            if not found:
                                    raise Exception('No suitable video driver found!')

                            size = (pygame.display.Info().current_w, pygame.display.Info().current_h)
                            print "Framebuffer size: %d x %d" % (size[0], size[1])
                            self.screen = pygame.display.set_mode(size, pygame.FULLSCREEN)

                    except:
                            print('No suitable Framebuffer found!')
                            pygame.init()
                            size = (1024, 768)
                            print "X server size: %d x %d" % (size[0], size[1])
                            self.screen = pygame.display.set_mode(size)
在以下情况下失败:

starting from __main__ call
disp_no localhost:11.0
I'm running under X display = localhost:11.0
Driver: fbcon
Driver: fbcon failed.
Driver: directfb
commandline read: python
commandline read: ./PiWxDisplay.py

~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.2.10 |~~~~~~~~~~~~~~~~~~~~~~~~~~
    (c) 2001-2008  The world wide DirectFB Open Source Community
    (c) 2000-2004  Convergence (integrated media) GmbH
  ----------------------------------------------------------------

(*) DirectFB/Core: Single Application Core. (2012-05-20 13:17)
(!) Direct/Util: opening '/dev/fb0' and '/dev/fb/0' failed
    --> No such file or directory
(!) DirectFB/FBDev: Error opening framebuffer device!
(!) DirectFB/FBDev: Use 'fbdev' option or set FRAMEBUFFER environment variable.
(!) DirectFB/Core: Could not initialize 'system_core' core!
    --> Initialization error!
Driver: directfb failed.
Driver: svgalib
Driver: svgalib failed..
No suitable Framebuffer found!
X server size: 1024 x 768
Traceback (most recent call last):
  File "./PiWxDisplay.py", line 366, in <module>
    wxdisplay().start_screen()
  File "./PiWxDisplay.py", line 66, in __init__
    self.screen = pygame.display.set_mode(size)
pygame.error: No available video device
从主调用开始
disp_no localhost:11.0
我在X display=localhost:11.0下运行
司机:fbcon
司机:fbcon失败了。
司机:directfb
命令行读取:python
命令行读取:./PiWxDisplay.py
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DirectFB 1.2.10|~~~~~~~~~~~~~~~~~~~~~~~~~~
(c) 2001-2008全球DirectFB开源社区
(c) 2000-2004 Convergence(集成媒体)有限公司
----------------------------------------------------------------
(*)DirectFB/Core:单应用程序核心。(2012-05-20 13:17)
(!)Direct/Util:打开“/dev/fb0”和“/dev/fb/0”失败
-->没有这样的文件或目录
(!)DirectFB/FBDev:打开帧缓冲区设备时出错!
(!)DirectFB/FBDev:使用“FBDev”选项或设置帧缓冲区环境变量。
(!)DirectFB/Core:无法初始化“system_Core”Core!
-->初始化错误!
驱动程序:directfb失败。
司机:svgalib
驱动程序:svgalib失败。。
找不到合适的帧缓冲区!
X服务器大小:1024 X 768
回溯(最近一次呼叫最后一次):
文件“/PiWxDisplay.py”,第366行,在
wxdisplay().启动屏幕()
文件“/PiWxDisplay.py”,第66行,在__
self.screen=pygame.display.set_模式(大小)
pygame.error:没有可用的视频设备
我显然不完全理解如何正确初始化pygame。我怎么才能把它弄到手呢

  • 检查是否有FB司机
  • 如果FB驱动程序检测失败,请使用X服务器

  • 您已将SDL\u视频驱动程序环境更改为仅检查fb设备

    我建议在调用异常处理程序之前使用此函数:

    os.putenv('SDL_VIDEODRIVER', 'x11')
    
    或者取消设置SDL\u VIDEODRIVER环境变量,这样pygame.init()就不会认为它已经被处理了


    请参阅:

    迟交的答案,但我希望我能早点尝试:

    您可能需要是root用户才能使用帧缓冲区驱动程序。


    (这对我的情况很有帮助:RaspberryPi 2没有运行X,但连接了屏幕。我现在可以通过SSH或直接在RPi上打开显示器)

    根据您的建议,我将“x11”添加到要尝试的驱动程序列表中。drivers=['fbcon','directfb','svgalib','xvfb','x11'],它在控制台(以前失败)和SSH会话中都能工作。谢谢杰出的很高兴听到这个消息。我只是在寻找与adafruit pygame scope钩子有关的其他东西时发现了你的问题,我自己也在寻找。。。但你的问题我已经过去了:)