python pygame

python - Llamar a una función PyGame, haciendo clic en un botón PyGame orientado a objetos



(1)

import pygame as pg import sys pg.init() buttonFont = pg.font.SysFont("garamond", 25) screenGray = pg.Color(''gray80'') buttonGray2 = pg.Color(''gray50'') textColour = pg.Color(''navy'') screen = pg.display.set_mode((800, 600)) clock = pg.time.Clock() class Button(pg.sprite.Sprite): def __init__(self, text, x, y, width, height, colour): super().__init__() self.image = pg.Surface((width, height)) self.image.fill(colour) self.rect = self.image.get_rect() txt = buttonFont.render(text, True, textColour) txtRect = txt.get_rect(center = self.rect.center) self.image.blit(txt, txtRect) self.rect.topleft = x, y def isPressed(self, event): if event.type == pg.MOUSEBUTTONDOWN: if self.rect.collidepoint(event.pos): return True return False def FrontPage(): screen.fill(screenGray) Continue = Button(''Continue'', 105, 455, 120, 50, buttonGray2) buttonsGroup1 = pg.sprite.Group(Continue) while True: for event in pg.event.get(): if event.type == pg.QUIT: pg.quit() sys.exit() elif Continue.isPressed(event): Menu() buttonsGroup1.draw(screen) pg.display.flip() clock.tick(60) def Menu(): screen.fill(screenGray) Scytale = Button(''Scytale'', 105,105,140,65, buttonGray2) Caesar = Button(''Caesar'', 330,105,140,65, buttonGray2) Vigenere = Button(''Vigenere'', 555,105,140,65, buttonGray2) Enigma = Button(''Enigma'', 105,430,140,65,buttonGray2) PublicKey = Button(''Public Key'', 330,430,140,65, buttonGray2) Rijndael = Button(''Rijndael'', 555,430,140,65, buttonGray2) buttonsGroup2 = pg.sprite.Group(Scytale,Caesar,Vigenere,Enigma,PublicKey,Rijndael) while True: for event in pg.event.get(): if event.type == pg.QUIT: pg.quit() sys.exit() buttonsGroup2.draw(screen) clock.tick(60) FrontPage()

Arriba está el código despojado de mi FrontPage, que tiene un botón que, cuando se hace clic, debe llevar al usuario a la pantalla del menú donde se muestran 6 botones más para pasar al método de cifrado elegido por los usuarios.

Sin embargo, cuando presiono el botón Continuar, no sucede nada.

¿Es porque hay algo mal con la clase de botón? ¿O hay algo más que hace que el botón deje de funcionar?

Gracias por adelantado


pg.display.flip() llamar a pg.display.flip() en la función Menu .

También tengo una pequeña recomendación sobre la estructura del código. Usaría otra función o clase ( main en este caso) para administrar las diferentes escenas. Así que primero asigno la función de escena actual a una variable y la llamo en el ciclo while principal. Cuando termine la escena, devuelvo la siguiente escena y la asigno a la variable de scene para intercambiar las escenas. Eso evitará posibles errores de recursión que se obtienen si solo llama a la siguiente función directamente desde otra escena (aunque es poco probable que exceda el límite de recursión de 1000 en un juego o aplicación simple).

import pygame as pg pg.init() screen = pg.display.set_mode((600, 400)) clock = pg.time.Clock() BLUE = pg.Color(''dodgerblue3'') ORANGE = pg.Color(''sienna3'') def front_page(): while True: for event in pg.event.get(): if event.type == pg.QUIT: return None # Press a key to return the next scene. elif event.type == pg.KEYDOWN: return menu screen.fill(BLUE) pg.display.flip() clock.tick(60) def menu(): while True: for event in pg.event.get(): if event.type == pg.QUIT: return None # Press a key to return the next scene. elif event.type == pg.KEYDOWN: return front_page screen.fill(ORANGE) pg.display.flip() clock.tick(60) def main(): scene = front_page # Set the current scene. while scene is not None: # Execute the current scene function. When it''s done # it returns either the next scene or None which we # assign to the scene variable. scene = scene() main() pg.quit()