Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame.time.wait()使窗口自由_Python_Pygame - Fatal编程技术网

Python pygame.time.wait()使窗口自由

Python pygame.time.wait()使窗口自由,python,pygame,Python,Pygame,我有一个简单的动画来处理,我画了一个矩形,当我点击表面时,矩形向左滑动并等待2秒钟,然后用向右滑动的动作重新绘制,但是如果我缩小或移动窗口并尝试,窗口会在等待的时刻冻结 代码如下: import sys, pygame from pygame.locals import * pygame.init() FPS = 30 BGCOLOR = (255, 255, 255) RECTCOLOR = (10, 0, 199) DS = pygame.display.s

我有一个简单的动画来处理,我画了一个矩形,当我点击表面时,矩形向左滑动并等待2秒钟,然后用向右滑动的动作重新绘制,但是如果我缩小或移动窗口并尝试,窗口会在等待的时刻冻结

代码如下:

import sys, pygame
from pygame.locals import *

pygame.init()

FPS       = 30
BGCOLOR   = (255, 255, 255)
RECTCOLOR = (10, 0, 199)
DS        = pygame.display.set_mode( (200,200) )
CLOCK     = pygame.time.Clock()
pygame.display.set_caption('Demo')

def main():
    DS.fill(BGCOLOR)
    pygame.draw.rect(DS, RECTCOLOR, (50, 50, 100, 100))
    pygame.display.update()

    while 1:
        ev = pygame.event.wait()
        if ev.type == QUIT:
            pygame.quit()
            sys.exit()
        elif ev.type == MOUSEBUTTONUP:
            animation()


def animation():
    pygame.event.set_blocked(MOUSEBUTTONUP)
    for x in range(10, 101, 10):
        pygame.draw.rect(DS, BGCOLOR, (150 - x,50,x,100))
        pygame.display.update()
        CLOCK.tick(FPS)
    pygame.time.wait(2000) # 2 seconds
    for x in range(10, 101, 10):
        pygame.draw.rect(DS, RECTCOLOR, (50,50,x,100))
        pygame.display.update()
        CLOCK.tick(FPS)
    pygame.event.set_allowed(MOUSEBUTTONUP)

if __name__ == '__main__':
    main()
为什么我们会有这种行为?也许系统没有在暂停时间和第二个for循环中的滴答声之间同步

PS:我在windows 7上,很抱歉我的英语不是我的母语

两件事:

当您运行这样的循环时:

for x in range(10, 101, 10):
        pygame.draw.rect(DS, BGCOLOR, (150 - x,50,x,100))
        pygame.display.update()
您可以绘制动画,但pygame没有机会处理从操作系统获得的消息。为了避免这种情况,应该在循环内调用
pygame.event.pump()
pygame.event.get()

从:

pygame.event.pump()

对于游戏的每一帧,您都需要对事件队列进行某种调用。这确保了您的程序可以在内部与操作系统的其余部分交互。如果您在游戏中未使用其他事件函数,则应调用pygame.event.pump()以允许pygame处理内部操作

如果您的程序通过其他pygame.event函数一致地处理队列上的事件,则不需要此函数

有一些重要的事情必须在事件队列内部处理。主窗口可能需要重新绘制或响应系统。如果长时间未能调用事件队列,系统可能会判定您的程序已锁定


另外,当你移动窗口时,你的游戏会冻结。这是SDL的一个已知限制(请记住pygame只是SDL的一个薄薄包装器),是由windows消息循环造成的:当您移动或调整窗口大小时,windows使用模式循环,这将阻止游戏运行的线程。

我建议您仅使用一个循环,并使用变量或用户事件跟踪游戏状态

例如:

game_state = 0

def main():
    global game_state
    rectangle_ticks = 0

    while 1:
        events = pygame.event.get()   # Get all pending events

        for ev in events:
            # Process events
            if ev.type == QUIT:
                pygame.quit()
                sys.exit()

            elif ev.type == MOUSEBUTTONUP:
                game_state = 1
                pygame.time.set_timer(pygame.time.set_timer(pygame.USEREVENT + 1, 1000)

            elif ev.type == pygame.USEREVENT + 1:
                pygame.time.set_timer(pygame.time.set_timer(pygame.USEREVENT + 1, 0)
                game_state = 2

        # Clear screen
        DS.fill(BGCOLOR)

        # Draw game state
        pygame.draw.rect(DS, RECTCOLOR, (50, 50, 100, 100))
        animation()

        # Update screen
        pygame.display.flip()

        CLOCK.tick(FPS)

def animation():
    if game_state == 1:
        for x in range(10, 101, 10):
            pygame.draw.rect(DS, BGCOLOR, (150 - x,50,x,100))

    if game_state == 2:
        for x in range(10, 101, 10):
            pygame.draw.rect(DS, RECTCOLOR, (50,50,x,100))
在每一次勾选中绘制整个屏幕可能看起来很奇怪,但在pygame中,为了摆脱不想继续绘制的旧对象,这是通常的工作方式

pygame.time.wait(1000) # 2 seconds
这会导致代码在此暂停2整秒钟。因此,直到2秒后,您才能获得任何事件


您需要使用动画或计时器。

从您的答案来看,现在似乎更清楚了一些,我已经在循环内测试了
pump()
get()
,但相同persists@Vutz是的,当您移动SDL窗口时,它将冻结。你不能摆脱它。只需谷歌
sdl窗口拖动冻结
或类似的东西。您将看到,此问题不仅限于pygame,还包括所有SDL应用程序。感谢您的回复,我知道存在拖动问题,但我想说的是,如果我在运行程序时不触摸窗口,则暂停时间不会冻结,但只要我移动或缩小窗口(不在动画上),就会冻结并重试冻结发生时,请尝试查看。如何执行?我对pygame非常陌生。