Parpadeo blanco de pygame de rectángulo con frecuencia específica.

Soy estudiante en la universidad y tengo una pregunta específica.

Actualmente muestro un rectángulo blanco en el centro de una ventana con un pygame sobre un fondo negro. Pero en este momento me gustaría parpadear mi rectángulo blanco a una frecuencia específica, y es por eso que necesito ayuda.

Actualmente pongo en práctica eso:

import pygame, sys from pygame.locals import * def main(): pygame.init() fenetre = pygame.display.set_mode((500,400),0,32) black=(0,0,0) white=(255,255,255) fenetre.fill(black) pygame.draw.rect(fenetre, white,(200,150,100,50)) while True: for event in pygame.event.get(): if event.type==QUIT: pygame.quit() sys.exit() pygame.display.update() main() 

introduzca la descripción de la imagen aquí

Gracias por tu ayuda en la comunidad.

    Método muy popular para controlar elementos es usar el tiempo.

    Establece la hora del siguiente estado de cambio y luego la compara con la hora actual. De esta manera, controlas el objeto y no te detienes en while True loop, por lo que te ofrece otras cosas.

     import pygame import sys # --- constants --- BLACK = ( 0, 0, 0) WHITE = (255, 255, 255) # --- main --- def main(): pygame.init() fenetre = pygame.display.set_mode((500, 400), 0, 32) # time in millisecond from start program current_time = pygame.time.get_ticks() # how long to show or hide delay = 500 # 500ms = 0.5s # time of next change change_time = current_time + delay show = True while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # --- updates --- current_time = pygame.time.get_ticks() # is time to change ? if current_time >= change_time: # time of next change change_time = current_time + delay show = not show # --- draws --- fenetre.fill(BLACK) if show: pygame.draw.rect(fenetre, WHITE,(200,150,100,50)) pygame.display.update() main() 

    EDITAR: lo mismo con más elementos.

     import pygame import sys # --- constants --- BLACK = ( 0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = ( 0, 255, 0) # --- main --- def main(): pygame.init() fenetre = pygame.display.set_mode((500, 400), 0, 32) current_time = pygame.time.get_ticks() # time of show or hide delay = 500 # 500ms = 0.5s # time of next change (WHITE) change_time = current_time + delay show = True # time of next change (RED) red_change_time = current_time + delay + 150 red_show = False # time of next change (GREEN) green_change_time = current_time + delay + 300 green_show = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # --- updates --- current_time = pygame.time.get_ticks() # is time to change ? (WHITE) if current_time >= change_time: change_time = current_time + delay show = not show # is time to change ? (RED) if current_time >= red_change_time: red_change_time = current_time + delay red_show = not red_show # is time to change ? (GREEN) if current_time >= green_change_time: green_change_time = current_time + delay green_show = not red_show # --- draws --- fenetre.fill(BLACK) if show: # (WHITE) pygame.draw.rect(fenetre, WHITE, (200,150,100,50)) if red_show: # (RED) pygame.draw.rect(fenetre, RED, (100,150,100,50)) if green_show: # (GREEN) pygame.draw.rect(fenetre, GREEN, (300,150,100,50)) pygame.display.update() main() 

    EDITAR: versión utilizando clase. Pero esta vez con diferentes frecuencias.

     import pygame import sys # --- constants --- BLACK = ( 0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = ( 0, 255, 0) # --- classes --- class Rectangle(): def __init__(self, color, rect, time, delay): self.color = color self.rect = rect self.time = time self.delay = delay self.show = False def draw(self, screen): if self.show: pygame.draw.rect(screen, self.color, self.rect) def update(self, current_time): if current_time >= self.time: self.time = current_time + self.delay self.show = not self.show # --- main --- def main(): pygame.init() fenetre = pygame.display.set_mode((500, 400), 0, 32) current_time = pygame.time.get_ticks() # time of show or hide delay = 500 # 5000ms = 0.5s # objects rect_white = Rectangle(WHITE, (200,150,100,50), current_time, 500) rect_red = Rectangle(RED, (100,150,100,50), current_time + 150, 100) rect_green = Rectangle(GREEN, (0, 0, 500, 400), current_time + 300, 2000) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # --- updates --- current_time = pygame.time.get_ticks() rect_white.update(current_time) rect_red.update(current_time) rect_green.update(current_time) # --- draws --- fenetre.fill(BLACK) rect_green.draw(fenetre) rect_white.draw(fenetre) rect_red.draw(fenetre) pygame.display.update() main() 

    Hice algunas modificaciones a su código para satisfacer sus necesidades y lo probé.

    El código

     import pygame import sys import time from pygame.locals import * pygame.init() fenetre = pygame.display.set_mode((500, 400), 0, 32) black = (0, 0, 0) white = (255, 255, 255) clock = pygame.time.Clock() frequency = 1 def main(): while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.draw.rect(fenetre, black, (200, 150, 100, 50)) pygame.display.update() time.sleep(frequency) pygame.draw.rect(fenetre, white, (200, 150, 100, 50)) pygame.display.update() time.sleep(frequency) clock.tick(30) main() 

    El resultado debe ser el rect apareciendo cada 1 seg.