Calling a PyGame Function, from clicking a Object-Orientated PyGame Button

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

Above is the stripped back code of my FrontPage, that has a button on it that, when clicked, should take the user to the menu screen where 6 more buttons are displayed to move onto the users chosen encryption method.

However, when I press the Continue button, nothing happens.

Is it because there is something wrong with the Button Class?
Or is there something else that makes the button stop working?

Thanks in advance

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You have to call pg.display.flip() in the Menu function.

I also have a little recommendation about the code structure. I’d use another function or class (main in this case) to manage the different scenes. So I first assign the current scene function to a variable and call it in the main while loop. When the scene is done, I return the next scene and assign it to the scene variable to swap the scenes. That will avoid potential recursion errors which you get if you just call the next function directly from within another scene (although it’s unlikely that you’ll exceed the recursion limit of 1000 in a simple game or app).

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x