为什么Pygame电影仅在事件输入时回放

时间:2016-07-28 22:07:23

标签: python pygame

我正在使用Python 2.7.9和Pygame中的一个小脚本,它将成为我们IT部门的一个小型显示器。这个想法是有几个切换开关,指示我们当前的状态(进出,等),有关我们学校计划的一些信息,并播放一个短片,重复与IT员工的图像等。我有一个更旧的编译的Pygame版本仍允许pygame.movi​​e运行。

脚本的所有部分都可以工作,但是当它到达.mpg的末尾时,电影将不会重播,直到有EVENT,例如切换我们的状态或移动鼠标。我试图用movie.get_time定义一个变量并在某个时间调用倒带,但是电影不会倒回(目前被注释掉)。有没有办法在不需要事件的情况下重复播放电影,或者我可以在一段时间后欺骗事件(注意pygame.movi​​e的文档已经过时,循环功能不起作用)?

感谢您的帮助!

import pygame, sys, os, time, random
from pygame.locals import *
pygame.init()

windowSurface = pygame.display.set_mode((0,0), pygame.FULLSCREEN)

pygame.display.set_caption("DA IT Welcome Sign")
pygame.font.get_default_font()
bg = pygame.image.load('da.jpg')
in_img = pygame.image.load('in.png')
out_img = pygame.image.load('out.png')
etc_img = pygame.image.load('etc.png')
present = in_img
done = False
img = 1
clock = pygame.time.Clock()
movie = pygame.movie.Movie('wallace.mpg')
movie_screen = pygame.Surface(movie.get_size()).convert()
playing = movie.get_busy()
movie.set_display(movie_screen)
length = movie.get_length()
currenttime = movie.get_time()
movie.play()

while not done:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            done = True
        if event.type == pygame.QUIT:
            movie.stop()
            done = True



        if event.type == pygame.KEYDOWN and event.key == pygame.K_1:
            img = 1
        if event.type == pygame.KEYDOWN and event.key == pygame.K_2:
            img = 2
        if event.type == pygame.KEYDOWN and event.key == pygame.K_3:
            img = 3
        if event.type == pygame.KEYDOWN and event.key == K_w:
            pygame.display.set_mode((800, 600))
        if event.type == pygame.KEYDOWN and event.key == K_f:
            pygame.display.set_mode((0, 0), pygame.FULLSCREEN)            
        if img == 1:
            present = in_img
        if img == 2:
            present = out_img
        if img == 3:
            present = etc_img
        if not(movie.get_busy()):
            movie.rewind()
            movie.play()
        #movie.get_time() 
        #if currenttime == 25.0:
        #   movie.stop()
        #   movie.rewind()
        #   movie.play()
    windowSurface.blit(bg, (0, 0))
    windowSurface.blit(movie_screen,(550,175))
    windowSurface.blit(present, (0,0))
    pygame.display.flip()

1 个答案:

答案 0 :(得分:0)

您需要获取用于从获取当前事件的for循环中重放影片的代码。通过向左移动代码4个空格,为代码和您希望连续发生的任何其他代码执行此操作而无需等待事件。

像这样:

while not done:
    for event in pygame.event.get(): #gets most recent event, only executes code below when there is an event
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            done = True
        if event.type == pygame.QUIT:
            movie.stop()
            done = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_1:
            img = 1
        if event.type == pygame.KEYDOWN and event.key == pygame.K_2:
            img = 2
        if event.type == pygame.KEYDOWN and event.key == pygame.K_3:
            img = 3
        if event.type == pygame.KEYDOWN and event.key == K_w:
            pygame.display.set_mode((800, 600))
        if event.type == pygame.KEYDOWN and event.key == K_f:
            pygame.display.set_mode((0, 0), pygame.FULLSCREEN)     
    #code below is out of the event for loop and thus executes whenever the while loop runs through       
    if img == 1:
        present = in_img
    if img == 2:
        present = out_img
    if img == 3:
        present = etc_img
    if not(movie.get_busy()):
        movie.rewind()
        movie.play()
    #movie.get_time() 
    #if currenttime == 25.0:
    #   movie.stop()
    #   movie.rewind()
    #   movie.play()
    windowSurface.blit(bg, (0, 0))
    windowSurface.blit(movie_screen,(550,175))
    windowSurface.blit(present, (0,0))
    pygame.display.flip()

我在尝试用pygame做事时也遇到了这个问题,这似乎是一个常见的错误。