4

我正在尝试将一些 gui 元素(带按钮的对话框)添加到我用 pygame 编写的游戏中。我四处寻找一个不错的 gui 工具包,最后得到了pgu。无论如何,我试图让它弹出一个对话框,它确实(有点),但它没有关闭。

这是我的代码的简化版本,它只显示了我关心的行为:


import pygame, sys
from pgu import gui

screen = None
WIDTH = 640
HEIGHT = 480

def init_pygame():
    global screen
    pygame.display.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT), pygame.DOUBLEBUF)
    pygame.display.set_caption('Testing PGU')

class SimpleDialog(gui.Dialog):
    def __init__(self):
        title = gui.Label("Spam")
        main = gui.Container(width=20, height=20)
        # I patched PGU to use new style classes.
        super(SimpleDialog, self).__init__(title, main, width=40, height=40)

    def close(self, *args, **kwargs):
        print "closing"
        return super(SimpleDialog, self).close(*args, **kwargs)

def run():
    init_pygame()
    app = gui.App()

    dialog = SimpleDialog()
    app.init(dialog)

    app.paint(screen)
    pygame.display.flip()
    while True:
        app.paint(screen)
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 3: # right mouse button
                    print "opening"
                    dialog.open()
                else:
                    app.event(event)
            elif event.type == pygame.QUIT:
                sys.exit()
            else:
                app.event(event)

if __name__=='__main__':
    run()

我看到的行为:打开一个带有全屏版本对话框的窗口。我所做的一切都不会关闭它,尽管右键单击将在我的控制台上打印“打开”,左键单击红色小圆圈将使其打印“关闭”。看起来对话框正在使用整个背景表面,而不是仅用于自身的较小的表面。

我想看到的行为:出现一个大黑屏(我稍后会在上面画),当我右键单击它时,会打开一个小窗口。当我左键单击关闭按钮时,窗口消失了。

我怀疑这与我没有使用桌面这一事实有关,但我不希望整个游戏都存在于 gui 中。

现在,为了明确起见,问题是:如何修改我的代码以从我看到的行为转变为我想看到的行为?如果有人知道比 pgu 更新的东西,我愿意使用不同的 gui 库。

4

2 回答 2

3

万一其他人想要这样做,我发现了一些可行的方法:创建一个空容器并调用app.init()它。

empty = gui.Container(width=WIDTH, height=HEIGHT)
gui.init(empty)
于 2010-08-22T14:24:38.700 回答
0

我曾尝试过类似于 nmicahaels 的回答来在我的 pygame 应用程序中实现独立对话框,但我一直收到类型错误:

pygame_pgu-0.21-py3.6.egg\pgu\gui\surface.py",第 10 行,in subsurface r = pygame.Rect(r) TypeError: Argument must be rect style object

r被通过了None

删除对话框height参数为我解决了这个问题。这是改编的代码

import pygame, sys
from pgu import gui

# original author: user nmicahaels https://stackoverflow.com/questions/3302973/making-popup-windows-in-pygame-with-pgu

WIDTH = 640
HEIGHT = 480


def init_pygame():
    pygame.display.init()
    screen = pygame.display.set_mode((WIDTH, HEIGHT), pygame.DOUBLEBUF)
    pygame.display.set_caption('Testing PGU')
    return screen


class SimpleDialog(gui.Dialog):
    def __init__(self):
        title = gui.Label("Spam")
        main = gui.Container(width=20, height=20)
        # passing the 'height' parameter resulting in a typerror when paint was called
        super(SimpleDialog, self).__init__(title, main, width=40)  # , height=40)

    def close(self, *args, **kwargs):
        return super(SimpleDialog, self).close(*args, **kwargs)


def run():
    black = (0, 0, 0)
    screen = init_pygame()  # type: pygame.Surface
    refresh = pygame.display.update
    app = gui.App()

    dialog = SimpleDialog()
    # app.init(dialog)

    empty = gui.Container(width=WIDTH, height=HEIGHT)
    app.init(empty)

    app.paint(screen)
    pygame.display.flip()
    while True:
        screen.fill(black)
        app.paint(screen)
        pygame.display.flip()
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 3:  # right mouse button
                    dialog.open()
                else:
                    app.event(event)
            elif event.type == pygame.QUIT:
                sys.exit()
            else:
                app.event(event)
    refresh()


if __name__ == '__main__':
    run()
于 2019-05-28T18:12:52.950 回答