Pygame: нечастое изменение размера окна - PullRequest
1 голос
/ 29 октября 2019

У меня небольшая проблема с системой событий Pygame. Вызов set_mode (...) приводит к тому, что события типа VIDEORESIZE возникают очень редко. Я смог воспроизвести это в небольшом сценарии, похожем на пример изменения размера в Pygame, из документов:

#!/usr/bin/python3

import sys
import pygame
from pygame.locals import *

WHITE = (255, 255, 255)

pygame.init()


flags = HWSURFACE|DOUBLEBUF|RESIZABLE
screen = pygame.display.set_mode((300, 300), flags)
screen.fill(WHITE)
pygame.display.flip()


while True:
    for event in pygame.event.get():
        print(event)
        if event.type is QUIT:
            pygame.display.quit()
            pygame.quit()
            sys.exit()
        elif event.type is VIDEORESIZE:
            # Version 1: do nothing
            #pass
            # Version 2: set_mode
            screen = pygame.display.set_mode(event.size, flags)
    screen.fill(WHITE)
    pygame.display.flip()

Версия 1: работает должным образом, отображаются все события VIDEORESIZE, белая поверхность не изменяется.

Версия 2: отображаются все события , за исключением 95% событий VIDEORESIZE, белая поверхность изменяет размеры при возникновении события изменения размера (с первого по три из них всегда появляются мгновенно,вероятно только первый вызов pygame.event.get (). Все остальное работает просто отлично.

SW / HW, одинарная / двойная буферизация не имеет никакого значения.

Version 2, black borders, surface not resizing

Python 3.7.3 Pygame 1.9.5 Linux Mint 19.2 Cinnamon 4.2.4 Linux 4.15.0-66

Были и другие сообщения, но они либо не вызывали set_mode, либо имели другие «симптомы»

Спасибоза вашу помощь!

Редактировать: Работает в Windows 10, даже если для каждого перетаскивания существует только одно событие изменения размера, поэтому «живое изменение размера» отсутствует. Кажется, это ошибка Pygame, есть идеи, как ее обойти?


1 Ответ

1 голос
/ 29 октября 2019

Для тех, кто сталкивается с той же проблемой, вот наиболее эффективный обходной путь (по крайней мере, на моем компьютере с Linux):

Вызов set_mode () только тогда, когда пользователь отпускает кнопку мыши, предотвращает появление спама в окне из-за спамаменеджер. Таким образом, при перетаскивании не происходит «живое изменение размера», но события VIDEORESIZE появляются намного чаще.

[...]
elif event.type is pygame.VIDEORESIZE:
    resized = True
    updateSize = event.size
elif event.type is pygame.ACTIVEEVENT and resized:
    screen = pygame.display.set_mode(updateSize, flags)

Если это не работает, проверьте, есть ли ACTIVEEVENT, когда вы отпускаете кнопку мыши после перетаскивания. граница окна. Также обратите внимание, что это приведет к тому, что размер окна перейдет к размеру последнего полученного события изменения размера (которое может отличаться от фактического размера, если события изменения размера снова нечасты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...