Окно Pygame зависает и перестает отвечать, как я могу это исправить? - PullRequest
1 голос
/ 14 июня 2019

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

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

Python 3.7.0 и Pygame 1.9.4

Класс кнопок:

import sys
import time
import pygame
pygame.init()

class button:
    def __init__(self, txt, location, bg=(255,255,255),fg=(0,0,0),size=(80,30),font_name="Times New Roman",font_size=16):
        #bg is the colour of the button
        #fg is the colour of the text
        #location refers to the center points of the button
        self.colour = bg
        self.bg = bg
        self.fg = fg
        self.size = size
        self.font = pygame.font.SysFont(font_name,font_size)
        self.txt = txt
        self.txt_surf = self.font.render(self.txt, 1, self.fg)
        self.txt_rect = self.txt_surf.get_rect(center=[s//2 for s in self.size])
        self.surface = pygame.surface.Surface(size)
        self.rect = self.surface.get_rect(center=location)
    def mouseover(self):
        self.bg = self.colour
        pos = pygame.mouse.get_pos()
        if self.rect.collidepoint(pos):
            self.bg = (200,200,200)
    def draw(self, screen):
        self.mouseover()
        self.surface.fill(self.bg)
        self.surface.blit(self.txt_surf, self.txt_rect)
        screen.blit(self.surface, self.rect)

Фактическое обновление / цикл рисования

import gui
import pygame
import sys
import time
import win32api
pygame.init()

screen = pygame.display.set_mode((400,400))
button1 = gui.button("No", (200,200))
intro = True
while intro:
    screen.fill((255,255,255))
    button1.draw(screen)
    if win32api.GetKeyState(0x01) == -127 or win32api.GetKeyState(0x01) == -128:
        if button1.rect.collidepoint(pygame.mouse.get_pos()):
            intro = False
            pygame.quit()
            sys.exit()
    pygame.display.flip()
    pygame.time.wait(20)

Я действительно просто хочу окночтобы остановить замерзание на бегу и фактически нажать кнопку работы.Что нужно сделать, это немедленно выйти из приложения, когда вы нажмете кнопку в середине.Хотя на самом деле не делать этого.

1 Ответ

2 голосов
/ 14 июня 2019

Вы должны позволить pygame обрабатывать события в очереди событий, вызывая pygame.event.get (или pygame.event.pump, но вы должны придерживаться get).

В противном случае очередь заполнится и новые события будут удалены. Это включает в себя внутренние события, которые сообщают вашей ОС рисовать окно и т. Д., Поэтому ваше окно будет зависать.

Кроме того, нет смысла использовать win32api для получения состояния клавиатуры (вместо этого можно использовать pygame.key.get_pressed), но это уже другая тема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...