Выйти из программы Python с кнопкой и методом обратного вызова - PullRequest
0 голосов
/ 05 мая 2018

Я чувствую, что делаю глупую ошибку, но не могу понять это. Вот код:

class menu:
    hover = False
    def __init__(self, text, pos):
        self.text = text
        self.pos = pos
        self.set_rect()
        self.draw()

    def draw(self):
        self.set_render()
        screen.blit(self.render, self.rect)

    def set_render(self):
        self.render = subFont.render(self.text, True, self.get_color())

    def get_color(self):
        if self.hover:
            return (BLACK)
        else:
            return (GREEN)

    def set_rect(self):
        self.set_render()
        self.rect = self.render.get_rect()
        self.rect.topleft = self.pos

select = [menu("Computer Virus", (100, 200)),
          menu("Computer Crime", (100, 300)),
          menu("QUIT", (100, 400))]
running = True
while running:
    for evnt in event.get():  
        if evnt.type == QUIT:
            running = False
    screen.fill(WHITE)    
    title()
    for menu in select:
        if menu.rect.collidepoint(mouse.get_pos()):
            menu.hover = True               
        else:
            menu.hover = False
        menu.draw()
    pointer()
    display.update()

но программа просто вылетает. Как я могу сделать так, чтобы я мог выйти из экрана при нажатии на quit?

1 Ответ

0 голосов
/ 05 мая 2018

Чтобы выйти из игры, вы можете определить функцию или метод, в котором вы устанавливаете переменную running равной False, а затем передаете ее одному из экземпляров кнопки как функция callback.

Вот более объектно-ориентированный пример с классом App, который имеет атрибут self.running и метод quit_game. Если пользователь нажимает кнопку, вызывается метод quit_game, для self.running устанавливается значение False, и основной цикл while останавливается.

import pygame


pygame.init()
# Global constants.
WHITE = pygame.Color('white')
GREEN = pygame.Color('green')
BLACK = pygame.Color('black')
FONT = pygame.font.Font(None, 40)


class Button:

    def __init__(self, text, pos, callback):
        self.text = text
        self.callback = callback
        self.image = FONT.render(self.text, True, GREEN)
        self.rect = self.image.get_rect(topleft=pos)

    def draw(self, screen):
        screen.blit(self.image, self.rect)

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                if self.rect.collidepoint(event.pos):
                    self.callback()
        elif event.type == pygame.MOUSEMOTION:
            if self.rect.collidepoint(event.pos):
                self.image = FONT.render(self.text, True, BLACK)
            else:
                self.image = FONT.render(self.text, True, GREEN)


class App:

    def __init__(self):
        self.screen = pygame.display.set_mode((640, 480))
        self.clock = pygame.time.Clock()
        self.select = [
            Button("Computer Virus", (100, 200), lambda: print("Computer Virus")),
            Button("Computer Crime", (100, 300), lambda: print("Computer Crime")),
            Button("QUIT", (100, 400), self.quit_game),
            ]

        self.running = True

    def quit_game(self):
        self.running = False

    def main_loop(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.running = False
                for button in self.select:
                    button.handle_event(event)

            self.screen.fill(WHITE)

            for button in self.select:
                button.draw(self.screen)

            pygame.display.update()
            self.clock.tick(60)


app = App()
app.main_loop()
pygame.quit()

Если вы не хотите использовать класс App, вы также можете написать функцию, которая изменяет глобальную переменную running. Однако обратите внимание, что глобальные переменные обычно не одобряются, потому что они затрудняют чтение кода и делают его более подверженным ошибкам (в данном случае это не так уж драматично).

def quit_game():
    global running
    running = False

# Pass it as the `callback` argument.
Button("QUIT", (100, 400), quit_game)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...