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

问题描述 投票:0回答:1

我有一个小型的 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,这就是我所寻找的。

最后一点是,我知道这是可能的,因为这是我大约一年前曾经成功实现过的事情。然而,由于驱动器崩溃,该示例已丢失。

linux sdl-2 pysdl2
1个回答
0
投票

我成功了。 好的,这就是我所做的。

  1. 完整的操作系统擦除 - 全新的 debian 安装(因为上帝知道我在实验中可能搞砸了什么)
  2. 像安装 PySDL2 时抱怨的那样设置 python 环境
  3. 通过 pip 和 sudo apt install sdl2-dev 安装 pysdl2

最重要的部分是运行 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()
© www.soinside.com 2019 - 2024. All rights reserved.