Странный SDL побочный эффект на неродственных окнах - PullRequest
13 голосов
/ 09 мая 2019

При игре с 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. Обратите внимание, как окно полупрозрачно, потому что я перетаскиваю его во время съемки.

after* * 1030

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

1 Ответ

0 голосов
/ 24 июня 2019

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

window.get_surface()

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

...