我有一个小型的 python3 和 PySDL2 应用程序,需要在无 GUI 的 debian Linux 上运行。这是一个在 Librea 计算机板 AML-S905X-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只是直接写入帧缓冲区。因此,如果我可以设置 PySDL2 来做到这一点,并全屏显示 gui,这就是我所寻找的。
最后一点是,我知道这是可能的,因为这是我大约一年前曾经成功实现过的事情。然而,由于驱动器崩溃,该示例已丢失。
我成功了。 好的,这就是我所做的。
最重要的部分是运行 UpdateWindow(w) 和 RenderPresent(r),这在 PySDL 文档中没有提到。但也许那是因为它是一个非常小众的用例场景。
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()