通过单击面向对象的PyGame按钮调用PyGame函数

2024-09-26 22:51:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

上面是我的FrontPage的精简代码,上面有一个按钮,当点击它时,应该会把用户带到菜单屏幕上,在那里会显示另外6个按钮来移动到用户选择的加密方法上。在

但是,当我按下继续按钮时,什么也没有发生。在

是因为Button类有问题吗? 或者是有什么东西让按钮停止工作?在

提前谢谢


Tags: rectimageselfeventtruegetifdef
1条回答
网友
1楼 · 发布于 2024-09-26 22:51:07

您必须在Menu函数中调用pg.display.flip()。在

对于代码结构,我也有一些建议。我将使用另一个函数或类(在本例中是main)来管理不同的场景。所以我首先将current scene函数赋给一个变量,并在main while循环中调用它。场景完成后,我返回下一个场景并将其分配给scene变量以交换场景。这将避免潜在的递归错误,如果你只是直接从另一个场景中调用下一个函数(尽管在一个简单的游戏或应用程序中,不太可能超过1000个递归限制)。在

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

相关问题 更多 >

    热门问题