Создание всплывающих окон в pygame с pgu - PullRequest
4 голосов
/ 21 июля 2010

Я пытаюсь добавить некоторые элементы графического интерфейса (диалоговые окна с кнопками) в игру, которую пишу с помощью pygame.Я искал приличный набор инструментов для графического интерфейса и получил 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.

Ответы [ 2 ]

3 голосов
/ 22 августа 2010

В случае, если кто-то еще захочет это сделать, я нашел кое-что, что работает: создайте пустой контейнер и назовите app.init() на нем.

empty = gui.Container(width=WIDTH, height=HEIGHT)
gui.init(empty)
0 голосов
/ 28 мая 2019

Я пытался сделать что-то похожее на ответ nmicahaels, чтобы создать автономное диалоговое окно в моем приложении pygame, но получал ошибку типа:

pygame_pgu-0.21-py3.6.egg \ pgu\ gui \ surface.py ", строка 10, в подповерхности r = pygame.Rect (r) Ошибка типа: Аргумент должен быть объектом стиля прямоугольника

(r передавалось None)

Удаление параметра диалога height устранило проблему для меня. Вот адаптированный код

import pygame, sys
from pgu import gui

# original author: user nmicahaels /2347691/sozdanie-vsplyvayschih-okon-v-pygame-s-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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...