【问题标题】:Pygame: window resizing infrequentlyPygame:窗口不经常调整大小
【发布时间】:2019-10-30 01:15:50
【问题描述】:

我的 pygame 事件系统有点问题。调用 set_mode(...) 会使 VIDEORESIZE 类型的事件很少出现。我能够在类似于文档中的 pygame resize 示例的小脚本中重现这一点:

#!/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,单/双缓冲没有任何区别。

Python 3.7.3 Pygame 1.9.5 Linux Mint 19.2 肉桂 4.2.4 Linux 4.15.0-66

这里还有其他帖子,但他们要么没有调用 set_mode,要么有其他“症状”

感谢您的帮助!

编辑:适用于 Windows 10,即使每次拖动只有一个调整大小事件,因此没有“实时调整大小”。似乎是一个 pygame 错误,任何想法如何解决它?


【问题讨论】:

  • 我在 Linux(Ubuntu 18.04,Cinnamon)上没有遇到过这个问题,使用的代码几乎相同。我在我的代码和 OP 代码之间看到的唯一区别是使用 is 而不是 ==(这两个运算符不等价)。 is 运算符用于比较两个变量是否“指向”同一个对象,而不是比较等价性。虽然代码的问题可能只是比较枚举类型。
  • 在原始数据类型的情况下,它似乎几乎相同,我更喜欢这种方式 :) 除了其他 if 表达式也可以正常工作,所以这似乎不是问题...也许,它与 X 窗口管理器或前面提到的 pygame 的肮脏实现有关,太慢而无法在我的(弱)笔记本电脑上流畅运行。

标签: python python-3.x pygame


【解决方案1】:

对于那些遇到同样问题的人,这里有一个最有效的解决方法(至少在我的 linux 机器上):

仅在用户释放鼠标按钮时调用 set_mode() 可防止 pygame 向窗口管理器发送垃圾邮件。这样在拖动时不会“实时调整大小”,但 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。另请注意,这将导致窗口大小跳转到最后接收到的调整大小事件的大小(如果调整大小事件再次不频繁,则可能与实际大小不同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2016-10-31
    相关资源
    最近更新 更多