【问题标题】:How to display an image after a time interval?如何在时间间隔后显示图像?
【发布时间】:2018-01-18 10:18:15
【问题描述】:

我想在用户单击鼠标左键 3 秒后显示图像。 这是我的代码的一部分:

pic=pygame.image.load('pic.png')
while True:
  for event.type==pygame.MOUSEBUTTONDOWN:
    screen.blit(pic,(100,100))

它只显示片刻。我尝试使用forwhile 循环,但是,它会卡住几秒钟,然后显示闪光。

我想我可以用一个计时器,加上 3s,像这样:

for event.type==pygame.MOUSEBUTTONDOWN:
  #get now time here,and assignment for timeclick
if timeclick+3s>=timenow:  # pseudocode
  screen.blit(pic,(100,100))

如何编写此代码段?还有更好的方法吗?

【问题讨论】:

    标签: python python-3.x pygame display


    【解决方案1】:

    您必须在主应用程序循环中绘制图像。使用 pygame.time.get_ticks() 返回自调用 pygame.init() 以来的毫秒数。当MOUSEBUTTONDOWN 事件发生时,然后计算必须显示图像之后的时间点。在当前时间大于计算的时间点后显示图像:

    import pygame
    pygame.init()
    screen= pygame.display.set_mode((800, 600))
    
    #pic = pygame.image.load('pic.png')
    pic = pygame.Surface((100, 100))
    pic.fill((255, 255, 255))
    pic_time = 0
    
    run = True
    while run:
        current_time = pygame.time.get_ticks()
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
    
            if event.type == pygame.MOUSEBUTTONDOWN:
                pic_time = current_time + 3000 # 3000 milliseconds == 3 seconds
    
        screen.fill(0)
    
        if pic_time > 0 and current_time >= image_time:
            screen.blit(pic,(100,100))
    
        pygame.display.flip()
    
    pygame.quit()
    

    【讨论】:

      【解决方案2】:

      当用户点击鼠标按钮时启动计时器,然后在主循环中计算经过的时间,如果是>= 3,则对图像进行blit。

      import pygame as pg
      
      
      def main():
          screen = pg.display.set_mode((640, 480))
          clock = pg.time.Clock()
          font = pg.font.Font(None, 40)
          img = pg.Surface((100, 100))
          img.fill((190, 140, 50))
          click_time = 0
          passed_time = 0
      
          done = False
      
          while not done:
              for event in pg.event.get():
                  if event.type == pg.QUIT:
                      done = True
                  # Start the timer.
                  elif event.type == pg.MOUSEBUTTONDOWN:
                      click_time = pg.time.get_ticks()
      
              screen.fill((30, 30, 30))
              if click_time != 0:  # If timer has been started.
                  # Calculate the passed time since the click.
                  passed_time = (pg.time.get_ticks()-click_time) / 1000
      
              # If 3 seconds have passed, blit the image.
              if passed_time >= 3:
                  screen.blit(img, (50, 70))
      
              txt = font.render(str(passed_time), True, (80, 150, 200))
              screen.blit(txt, (50, 20))
      
              pg.display.flip()
              clock.tick(30)
      
      
      if __name__ == '__main__':
          pg.init()
          main()
          pg.quit()
      

      【讨论】:

      • 先谢谢了。但是为什么很多人最后都加了sys.exit()呢?我只用了pygame.quit()。可能都是一样的吧。
      • 我想我曾经读过,在某些系统上关闭 pygame 窗口可能很麻烦,sys.exit 可以提供帮助,但找不到来源。也许这是过去的遗物,不再需要了。我需要调查。
      • 感谢您的支持!您也可以accept answers,这将为您提供 2 点声望点,为响应者提供 15 点声望点,但您不必这样做。
      • 调用sys.exit() 似乎真的是过去的遗物,据报道它对旧的 Python 和 pygame 版本很有用。看起来你可以省略它。 pygame.quit 实际上也不需要,除了在 IDLE 编辑器中运行游戏的人(没有pygame.quit,它无法关闭 pygame 窗口)。所以如果你想对 IDLE 友好,你可以把它留在里面。
      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 2014-02-28
      • 1970-01-01
      • 2012-08-16
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      相关资源
      最近更新 更多