使用按钮和回调方法退出 python 程序



我觉得我犯了一个愚蠢的错误,但我似乎无法弄清楚。 这是代码:

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()

但是程序只会崩溃。 如何使我在单击退出时可以退出屏幕?

若要退出游戏,可以定义一个函数或方法,在其中将running变量设置为False,然后将其作为callback函数传递给其中一个按钮实例。

下面是一个更面向对象的示例,其中包含具有self.running属性和quit_game方法的App类。如果用户单击该按钮,则会调用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)

最新更新