当前位置: 首页 > 面试题库 >

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

杨良平
2023-03-14
问题内容

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类有问题吗?还是有其他原因使按钮停止工作?

提前致谢


问题答案:

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

我还对代码结构有一些建议。我将使用另一个函数或类(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()


 类似资料:
  • 我在pygame中为点击事件制作了按钮,但存在一个问题。当我单击鼠标按钮并在按钮边界之间移动鼠标时,单击事件会重复自身。我只想单击一下,直到松开鼠标按钮。我该怎么做?

  • 我正在使用JavaFX构建一个calander/planner应用程序。该应用程序包括一个单一的GridPane与35(7x5)VBox的。在这些VBox中有任务按钮(在下面实现)。当我右键单击任务框时,它将把文本变成灰色,当我左键单击TsskButton时,我希望它删除按钮。我已经知道的事情。 AnchorPaneNode(扩展VBox)没有静态getChildren()方法 我无法为窗格创建单

  • 问题内容: 我创建了一个名为functioncalling.php的页面,其中包含两个按钮 Submit 和 Insert 。作为PHP的初学者,我想测试单击按钮时执行的功能。我希望输出出现在同一页面上。因此,我创建了两个功能,每个按钮一个。functioncalling.php的源代码如下: 这里的问题是单击任何按钮后都没有输出。 我到底哪里出问题了? 问题答案: 是的,您在这里需要Ajax。请

  • 我正在使用ASP.NET和JavaScript创建一个计算器。当用户单击按钮时,现在正试图使它对按钮7起作用,它会调用一个javascript函数,以查看用户是否单击了clear按钮、back space按钮,或者他们是否单击了number按钮。如果它是一个数字按钮,则该函数将把数字添加到文本框中。例如,如果用户点击7然后点击8,然后点击*,然后点击1,文本框将显示:78*1。我无法使javasc

  • 问题内容: 我正在尝试编写Django应用程序,而我却被困在单击按钮时如何调用视图函数。 在我的模板中,我有一个如下所示的链接按钮,单击该按钮会将您带到另一个网页: 单击按钮时,我还想调用Django视图函数(以及重定向到目标网站)。查看功能使数据库中的值增加,该值存储了单击按钮的次数。 该是到外部网站(如链接 www.google.com )。现在,单击该按钮时,它将打开一个新窗口,该窗口将您带

  • 问题内容: 我想知道是否有人可以指出我正确的方向。我有一个带有click事件的asp.net按钮(运行一些服务器端代码)。我想做的是通过ajax和jquery调用此事件。有什么办法吗?如果是这样,我会喜欢一些例子。 提前致谢 问题答案: 这就是jQuery对于ASP.Net开发人员真正的亮点。假设您有这个ASP按钮: 呈现后,您可以查看页面的源,页面上的ID不会是btnAwesome,而是$ ct