[英]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.