【发布时间】: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