linux 如何在没有OS gui(无X)的debian上运行SDL2 GUI应用程序?

thtygnil  于 11个月前  发布在  Linux
关注(0)|答案(1)|浏览(163)

我有一个小的python3和PySDL 2应用程序,需要在没有GUI的debian Linux上运行。这是一个在Librea计算机板AML-S905 X-CC上运行的嵌入式项目。我将HDMI输出连接到显示器,我可以看到控制台,因此视频驱动程序可以工作。桌面环境的性能成本太高,对我的用例来说完全没有必要。
我已经找到了其他人谁已经能够实现这一点,而回来的过程似乎很熟悉:https://discourse.libsdl.org/t/possible-to-run-sdl2-headless/25665
代码很简单:

import sys
import os
import sdl2.ext

os.putenv("SDL_VIDEODRIVER","dummy")
RESOURCES = sdl2.ext.Resources(__file__, "resources")

print("start")

sdl2.ext.init()

window = sdl2.ext.Window("Hello World!",size=(720,480), flags=sdl2.SDL_WINDOW_HIDDEN)
window.show()

while True:
     continue

字符串
应用程序确实会运行,但它只是停留在控制台屏幕上。
据我所知,如果没有驱动程序,Linux只是直接写入帧缓冲区。所以如果我能设置PySDL 2来做这件事,并全屏显示gui,这就是我所寻找的。
最后一点要注意的是,我知道这是可能的,因为这是我曾经设法实现过的,大约一年前。然而,由于驱动器崩溃,该示例已经丢失。

6bc51xsx

6bc51xsx1#

我让它工作了。好的,这就是我所做的。
1.完整的操作系统擦除-全新的Debian安装(因为上帝知道我在实验中可能搞砸了什么)
1.按照安装PySDL 2时抱怨的那样设置python env
1.通过pip安装pysdl 2和sudo安装sdl 2-dev
最重要的部分是运行UpdateWindow(w)和RenderPresent(r),这在PySDL文档中没有提到,但可能是因为它是一个利基用例场景。
简单地说,这可能不是完美的代码,因为我不是Maven。但由于所有的Maven都懒得帮助解决这类问题,这是你得到的最好的:

import ctypes
import sys
from sdl2 import *
import time

SDL_Init(SDL_INIT_EVENTS)

w = SDL_CreateWindow(b"test", 0,0, 800,600, SDL_WINDOW_INPUT_FOCUS | SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_HIDDEN)
SDL_ShowWindow(w)
SDL_RaiseWindow(w)

window_surface = SDL_GetWindowSurface(w)
r = SDL_CreateSoftwareRenderer(window_surface)
#r = sdl2.ext.Renderer(w, -1, (800,600), sdl2.SDL_RENDERER_SOFTWARE)

#sprite_factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=r)
#sprite = sprite_factory.from_image("resources/imgs/fr.png")

event = SDL_Event()

running = True
while running:

        while SDL_PollEvent(event) != 0:
                print("events were present", event.key.keysym.sym)
                #print(SDL_GetKeyName(event.key.keysym.sym))
                if event.type == SDL_QUIT:
                        running = False
                        break

                if event.type == SDL_KEYDOWN:
                        #if event.key.keysym.sym == sdl2.SDLK_ESCAPE:
                        running = False
                        print("keydown detected")
                        break

        SDL_RenderClear(r)

        #sprite_render = sprite_factory.create_sprite_render_system(r)
        #sprite_render.render(sprite, x=100, y=100)

        #WHITE = sdl2.ext.Color(255,255,255,255)
        #r.draw_rect((5,5,64,64), WHITE)

        SDL_UpdateWindowSurface(w)
        SDL_RenderPresent(r)

SDL_DestroyWindow(w)
SDL_Quit()
exit()

字符串

相关问题