Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What alternatives are there to `time.sleep()` and `pygame.time.wait()`?

I'm very new to python. I am working on a simple game. So far, what I am trying to do is to add a few second delay between it showing the question rectangle and then showing the options. How would I do this? I tried using time.sleep or pygame.time.wait, but all of those showed a black screen, and then showed both the question and the options at the same time. By the way I am using pygame :). Here is my code:

try:
    logname = 'c:/temp/pgzrun.log'
    fontname = 'arial.ttf'   
    import faulthandler
    import math
    faulthandler.enable()
    import time
    import os, sys, importlib
    from time import sleep 
   
    script_dir = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    os.chdir(script_dir)
    
    import pgzrun
    import playsound
    import pygame 
    
    import random 
    from random import randint

    WIDTH = 1280
    HEIGHT = 720
    sys.setrecursionlimit(10000000)
    q1 = ["SIFS", "ba", "bo", "bi", "blo", 1]
    q2 = ["AFST", "la", "lo", "li", "lloo", 3]
    q3 = ["jaks", "fa", "fo", "fi", "asdlo", 2]
    q4 = ["afsa", "afsfga", "dfsdff", "dfdf", "safaawr", 2]
    questions = [q1, q2, q3, q4]
    question_box = Rect(500, 400, 140, 100)
  
    def draw():
        
        index = 0
        screen.fill("purple")
        screen.draw.filled_rect(question_box, "blue")
        screen.draw.textbox(str(questions[index][0]), question_box)
        screen.draw.filled_rect(answer_boxes[0], "blue")
        screen.draw.filled_rect(answer_boxes[0], "blue")
        screen.draw.filled_rect(answer_boxes[1], "blue")
        screen.draw.filled_rect(answer_boxes[2], "blue")
        screen.draw.filled_rect(answer_boxes[3], "blue")
     
    ab1 = Rect(0, 0, 140, 100)
    ab2 = Rect(0, 0, 140, 100)
    ab3 = Rect(0, 0, 140, 100)
    ab4 = Rect(0, 0, 140, 100)
    ab1.move_ip(40, 80)
    ab2.move_ip(300, 80)
    ab3.move_ip(600, 80)
    ab4.move_ip(900, 80)
    answer_boxes = [ab1, ab2, ab3, ab4]
    random.shuffle(questions)
    game_over = False
   
    pgzrun.go()
        
except:
    import traceback
    with open(logname, 'a', encoding = 'utf-8') as f:
        f.write(''.join(traceback.format_exc()) + '\n')
like image 562
Parul Deep Singh Avatar asked Nov 06 '22 03:11

Parul Deep Singh


1 Answers

When you program an interactive application, you have an event loop. In that case you shouldn't block the program with sleep or similar commands.

Instead, you should use timers to trigger events. In Pygame Zero, you would use clock.schedule to trigger a function call after a specified period of time.

Here's how I would implement such an application:

import pgzrun

questions = ["One", "Two"]

index = 0
can_answer = False

def show_answers():
    global can_answer
    can_answer = True

def on_mouse_down(pos):
    global can_answer, index
    if can_answer:
        can_answer = False
        index = index + 1
        clock.schedule(show_answers, 1.0)
    
def draw():
    screen.fill("black")
    screen.draw.textbox(questions[index], Rect(0, 0, 200, 100))
    if can_answer:
        screen.draw.filled_rect(Rect(0, 100, 200, 50), "blue")

clock.schedule(show_answers, 1.0)
pgzrun.go()
like image 132
r0the Avatar answered Nov 12 '22 20:11

r0the