Странный SDL побочный эффект на неродственных окнах - программирование
Подтвердить что ты не робот

Странный SDL побочный эффект на неродственных окнах

При игре с sdl2 через pysdl2 я заметил этот странный побочный эффект, когда однажды скрипт sdl запускает несвязанные окна, которые обычно становятся прозрачными при перемещении, теперь остаются непрозрачными.

Я бы не возражал против всего этого, если бы не было ноющее чувство, что это означает, что я делаю что-то в корне неправильно.

Кто-нибудь может просветить меня о том, что, черт возьми, здесь происходит?

Вот мой сценарий:

import sdl2
import sdl2.ext as se
import time

def main():
    k = 2
    event_buffer = (k * sdl2.SDL_Event)()
    se.init()
    window = se.Window("what the ?", size=(400, 300))
    window.show()
    while True:
        window.refresh()
        time.sleep(0.01)
        sdl2.SDL_PumpEvents()
        sdl2.SDL_PeepEvents(event_buffer, k, sdl2.SDL_GETEVENT,
                            sdl2.SDL_FIRSTEVENT, sdl2.SDL_LASTEVENT)
        for event in event_buffer:
            if not event.type:
                continue
            elif event.type == sdl2.SDL_QUIT:
                se.quit()
                break
            else:
                pass
            event.type = 0
        else:
            continue
        break

if __name__ == '__main__':
    main()

И вот захват экрана до и после:

before

В окне "Системные настройки" моего рабочего стола KDE 5.45.0 без запущенного сценария sdl отображаются соответствующие настройки " Effects>Translucency рабочего стола" Effects>Translucency. Обратите внимание, как окно полупрозрачно, потому что я перетаскиваю его во время съемки.

after

То же самое, но с запущенным сценарием sdl. Обратите внимание, что окно, несмотря на то, что я энергично его перетаскиваю, остается упрямо непрозрачным.

4b9b3361

Ответ 1

Я также могу воспроизвести это на своем рабочем столе Ubuntu с Unity, так что это определенно не проблема вашего рабочего стола KDE. Я думаю, что это ошибка в pysdl2, и это решение должно быть временным решением, пока оно не будет исправлено, но пока вы можете просто добавить это в свой цикл while:

window.get_surface()

О проблеме уже сообщается здесь: https://github.com/marcusva/py-sdl2/issues/139