簡體   English   中英

如何清除 pygame 事件隊列?

[英]How to clear pygame event queue?

我用pygame設計了一個心理物理實驗。 實驗的一般流程是,每次試驗出現兩個物體,然后按左右方向鍵select其中一個,系統會通知結果,然后進行下一次試驗。 現在我發現了這樣一個問題:在某些電腦上運行時,如果我在一次試用中多次按下左右鍵,在普通電腦上運行時應該在下一次選擇之前清除事件隊列,結果應該是本次試用選擇后給出,在我的個人筆記本上也是如此(多次按下不影響下次選擇); 但是在某些電腦上,運行同一個程序時,會按照按鍵的先后順序依次執行后面幾次的選擇(不做選擇,會自動按照關於按鍵的順序進行select)。 另外,即使在普通電腦上用pyinstaller封裝了程序,在問題電腦上使用封裝的程序時,還是會出現問題。 我該如何解決?

這是程序部分。 如果您需要運行總程序,我將提供給您。

# wait for a click
def wait4click(duration=1500):
    left = (WIN_LENGTH / 4 - IMG_HEIGHT / 2, WIN_WIDTH / 2 - IMG_WIDTH / 2)
    right = (3 * WIN_LENGTH / 4 - IMG_HEIGHT / 2, WIN_WIDTH / 2 - IMG_WIDTH / 2)
    pygame.event.clear()
    t_start = pygame.time.get_ticks()
    while True:
        t_now = pygame.time.get_ticks()
        if t_now - t_start > duration:
            return 'BLANK'
        else:
            for event in pygame.event.get():
                if event.type == KEYDOWN:

                    if event.key == K_LEFT:
                        choice = 'left'
                        pygame.draw.polygon(win, red, [eval(choice),
                                                       (eval(choice)[0] + IMG_HEIGHT, eval(choice)[1]), (
                                                           eval(choice)[0] + IMG_HEIGHT,
                                                           eval(choice)[1] + IMG_WIDTH),
                                                       (eval(choice)[0], eval(choice)[1] + IMG_WIDTH)], 10)
                    elif event.key == K_RIGHT:
                        choice = 'right'
                        pygame.draw.polygon(win, red, [eval(choice),
                                                       (eval(choice)[0] + IMG_HEIGHT, eval(choice)[1]), (
                                                       eval(choice)[0] + IMG_HEIGHT,
                                                       eval(choice)[1] + IMG_WIDTH),
                                                   (eval(choice)[0], eval(choice)[1] + IMG_WIDTH)], 10)
                    elif event.key in [K_ESCAPE]:
                        resp = pygame.key.name(event.key)
                        pygame.event.clear()
                        return resp
                    else:
                        continue
                    pygame.event.clear()
                    return choice

train_list = ['p1', 'p1', 'p2', 'p2', 'p2', 'p2', 'p1', 'p1']
for i in range(len(train_list)):
    [correct_cue_loc, wrong_cue_loc] = draw_cue(train_list[i], introduction=True, symbol=True) # draw two objects
    subj_choose = wait4click(duration=1500)
    break_signal = train_judgement(subj_choose)  # judge and show the result on the screen
    if break_signal:
        break
    pygame.time.wait(1000)
    fadeout()    # equal to win.fill(grey),[output][/output] pygame.display.update()
    text_msg('+')
    pygame.time.wait(1000)
    win.fill(grey)

我在您的問題上花了很多時間,因為它昨天出現在我正在弄亂/試圖修復的游戲中。 答案似乎是

時間.sleep()

我完全不知道為什么或如何在代碼中實現它。 以下代碼始終如一地工作以獲得正確的時間。 即使您從第一個定時器到第二個定時器按住鍵,當您抬起手指時,第二個定時器也會在 KEYUP 上觸發:

import pygame, sys, time

if __name__ == '__main__':
    pygame.init()
    screen_width = 600
    screen_height = 600
    screen = pygame.display.set_mode((screen_width, screen_height))
    clock = pygame.time.Clock()

    print('timer started')
    t_start = pygame.time.get_ticks()
    pygame.event.clear()
    event =  pygame.event.wait()
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            print('we got a space')
        if event.key == pygame.K_RIGHT:
            print('we got a Right')
        if event.key == pygame.K_LEFT:
            print('we got a Left')
    pygame.event.clear()
    t_now = pygame.time.get_ticks()
    print(f"timer ended {t_now - t_start} ticks")
    time.sleep(1)  # without this line it doesn't work right
                   # and I have no ^&$% idea why.

    print('timer started again')
    t_start = pygame.time.get_ticks()
    pygame.event.clear()
    event =  pygame.event.wait()
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE:
            print('we got a space')
        if event.key == pygame.K_RIGHT:
            print('we got a Right')
        if event.key == pygame.K_LEFT:
            print('we got a Left')
    t_now = pygame.time.get_ticks()
    print(f"timer ended {t_now - t_start} ticks")

祝你好運,但隨着時間的推移,異步中斷處理會讓你發瘋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM