Как обновить отображение окна pygame после выполнения условия?

#python #pygame

#python #pygame

Вопрос:

У меня есть некоторый код для окна pygame:

 while True:
    try:
        gameDisplay.fill(white)
        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()
    except Exception:
        pass 

    a=button("Enter",100,150,100,50,darkgreen,green,"play")
    button("Exit",450,150,100,50,darkred,red,"quit")

    for event in pygame.event.get() :
        if event.type == pygame.QUIT :
            pygame.quit()
    pygame.display.update()
    #if a == False:
        #pygame.quit()
    
  

он отображает 2 кнопки (созданные функцией button), на которые можно нажать. При нажатии на зеленую кнопку появляется окно ввода tkinter. После того, как пользователь вводит необходимые данные и входные данные подтверждены, функция возвращает состояние (если пользователь правильно ввел данные false). После того, как это произойдет, я хочу изменить то, что отображается в окне, и показать что-то совершенно другое. Первоначальная цель «a» (состояние) состояла в том, чтобы закрыть окно и открыть новое окно после проверки входных данных, однако после исследования я обнаружил, что вы не можете открыть два окна в одном скрипте.

Я пробовал это:

 if a == False:
        gameDisplay.fill(white)
        gameDisplay.blit(image1, (50, 0))
        gameDisplay.blit(image2, (50, 100))
        gameDisplay.blit(image3, (50, 200))
        gameDisplay.blit(image4, (50, 300))
        gameDisplay.blit(image5, (120, 100))
        gameDisplay.blit(image6, (120, 200))
        gameDisplay.blit(image7, (130, 260))
        gameDisplay.blit(image8, (130, 290))
        gameDisplay.blit(image9, (130, 320))
        gameDisplay.blit(text, (0,0))
        gameDisplay.blit(text2, (200,385))
        gameDisplay.blit(text3, (200,369))
        gameDisplay.blit(text4, (300,25))
        gameDisplay.blit(text5, (300,100))
        gameDisplay.blit(image16, (300, 45))
        gameDisplay.blit(image17, (350, 45))
        gameDisplay.blit(text6, (300, 170))
        gameDisplay.blit(image10, (300, 120))
        gameDisplay.blit(image11, (350, 120))
        gameDisplay.blit(image12, (400, 120))
        gameDisplay.blit(image13, (450, 120))
        gameDisplay.blit(image14, (500, 120))
        gameDisplay.blit(image15, (550, 120))
        gameDisplay.blit(image19, (300, 190))
        gameDisplay.blit(image20, (350, 190))
        pygame.display.update()
  

и разместил его после функции второй кнопки, но не сработал. Есть идеи?

Комментарии:

1. Программа неправильно отформатирована в отношении отступа. Похоже, что вы воссоздаете кнопки на каждой итерации основного цикла, что, вероятно, тоже неверно.

2. @RufusVS это было именно так, как я вставил код. Я исправил это сейчас

Ответ №1:

Для Pygame старайтесь оставаться в одном цикле. В зависимости от условия, покажите кнопки или сыграйте в игру.

Попробуйте этот код:

 a = True  # show buttons
while True:        
    try:
        gameDisplay.fill(white)
        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()
    except Exception:
        pass  

    if a == True:  # keep showing buttons until user clicks one
        a=button("Enter",100,150,100,50,darkgreen,green,"play")
        button("Exit",450,150,100,50,darkred,red,"quit")
        
    if a == False:  # run game
            gameDisplay.fill(white)
            gameDisplay.blit(image1, (50, 0))
            ...........
            gameDisplay.blit(image19, (300, 190))
            gameDisplay.blit(image20, (350, 190))
            
    for event in pygame.event.get() :
        if event.type == pygame.QUIT :
            pygame.quit()
    pygame.display.update()
    #if a == False:
        #pygame.quit()

    pygame.display.update()
  

Комментарии:

1. Это работает, однако новое содержимое отображается только в течение половины секунды, прежде чем переключиться обратно на кнопки. Я поставил «a = True» вне цикла while, и это сработало