Окно Pygame работает нормально, пока не нажата, затем показывает Не отвечает

Сначала несколько вещей:

  1. Я использую Windows 10 Home edition
  2. Я использую Python 3.7
  3. Я использую pygame 1.9.4
  4. Моя IDE - это код Visual Studio с IDLE в качестве резервной копии

В настоящее время я разрабатываю графический интерфейс с использованием pygame. ПРИМЕЧАНИЕ: код еще НЕ готов.

Когда я запускаю сеанс отладки в VS Code, он (в основном) работает так, как ожидалось, но когда я пытаюсь нажать кнопку запуска, pygame не отвечает и показывает, что не отвечает.

Я также заметил это с другими созданными мной скриптами pygame, где окно pygame зависает при нажатии или перемещении.

Любая помощь будет оценена по достоинству.

Вот код:

# Import modules
import sys, pygame, time, math
from time import sleep
from PIL import Image

# Display background image
image = 'asdf.png'
change = 2
img = Image.open('asdf.png')
width = img.width * change
height = img.height * change
print(width)
print(height)
screen = pygame.display.set_mode((width,height))
background = pygame.image.load(image).convert()
newscreen = pygame.transform.scale(background, (width, height))
screen.blit(newscreen, (0,0))
pygame.display.update()

# start button
pygame.draw.rect(newscreen, (255,120,0), pygame.Rect(width/4,height-height/4, width/2, height/7))
screen.blit(newscreen, (0,0))
pygame.display.update()
pygame.init()
myFont = pygame.font.SysFont("Times New Roman", 100)
text = myFont.render("START", False, (0, 0, 0))
screen.blit(text, (width/4+8,height-height/4-10))
pygame.display.update()
pygame.image.save(newscreen, 'background.png')
pygame.image.save(text, 'starttext.png')

# i button
pygame.draw.rect(newscreen, (255,0,120), pygame.Rect(width - 50, 10, 40,40))
screen.blit(newscreen,(0,0))
pygame.display.update()
myFont = pygame.font.SysFont("Times New Roman", 25)
ibutton = myFont.render("i", False, (0, 0, 0))
screen.blit(ibutton, (width-32,17))
pygame.display.update()

# Mouse click
while True:
    left,right,center = pygame.mouse.get_pressed()
    if left == True:
        if event.type == MOUSEBUTTONUP:
            x,y = pygame.mouse.get_pos()
            if ((width/4) <= x <= ((width/4) + (width/2))) and ((height-height/4) <= y <= ((height-height/4) + height/76)):
                #move to next screen
                break

time.sleep(5)

Это НЕ похоже на связанную проблему, потому что моя программа предназначена для графического интерфейса пользователя и требует событий щелчка мыши.


person Clemence Yi    schedule 31.07.2018    source источник
comment
Возможный дубликат окна Pygame не отвечает через несколько секунд   -  person skrx    schedule 31.07.2018
comment
Не дубликат, а другой вариант использования   -  person Clemence Yi    schedule 31.07.2018
comment
Вы запускаете бесконечный цикл, который никогда не читает из очереди событий и не обновляет отображение. Итак, он не реагирует, поэтому Windows сообщает вам, что он не реагирует.   -  person abarnert    schedule 31.07.2018
comment
Это дубликат. Вы должны вызывать одну из функций pygame.event для каждого кадра или окно перестанет отвечать.   -  person skrx    schedule 31.07.2018
comment
Спасибо за весь ваш ответ! Думаю, теперь мой следующий вопрос будет заключаться в том, как правильно читать из очереди событий?   -  person Clemence Yi    schedule 31.07.2018


Ответы (1)


Этот ответ Теда Кляйна Бергама объясняет, почему окно перестает отвечать: https://stackoverflow.com/a/42719689/6220679

Вот как следует использовать pygame.event.get:

running = True
while running:
    for event in pygame.event.get():
        # This lets you quit by pressing the X button of the window.
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONUP:
            if event.button == 1:  # 1 = left mouse button, 2 = middle, 3 = right.
                print('mouse up')
                x,y = pygame.mouse.get_pos()
                if ((width/4) <= x <= ((width/4) + (width/2))) and ((height-height/4) <= y <= ((height-height/4) + height/76)):
                    #move to next screen
                    running = False

В вашем случае (для простого приложения с графическим интерфейсом) _3 _, вероятно, будет хорошим выбором (он позволяет программе спать, пока в очереди нет событий).

running = True
while running:
    event = pygame.event.wait()
    if event.type == pygame.MOUSEBUTTONUP:
        if event.button == 1:
            print('mouse up')
            x,y = pygame.mouse.get_pos()
            if ((width/4) <= x <= ((width/4) + (width/2))) and ((height-height/4) <= y <= ((height-height/4) + height/76)):
                #move to next screen
                running = False
person skrx    schedule 31.07.2018
comment
Большое спасибо! - person Clemence Yi; 31.07.2018
comment
Пожалуйста! Если у вас есть другие проблемы, я рекомендую сначала проверить некоторые ресурсы, например Программирование аркадных игр. Я также рекомендую добавить экземпляр pygame.time.Clock и вызвать clock.tick(FPS) каждый кадр, если вы выберете pygame.event.get решение. - person skrx; 31.07.2018