如何使用 pygame-menu 作为 pygame 程序的设置菜单?

问题描述 投票:0回答:1

我正在制作一个 pygame 程序,并决定使用 pygame-menu 库来为设置菜单提供一些简单的 GUI。我能找到的每个示例都使用菜单作为整个程序,这使得很难弄清楚如何向 pygame 程序添加菜单。

每次运行以下代码时,都会收到错误:

import pygame
import pygame_menu

pygame.init()

clock = pygame.time.Clock()
scrn_size = pygame.display.Info()
scrn = pygame.display.set_mode((scrn_size.current_w, scrn_size.current_h), pygame.FULLSCREEN)

rotation_menu = pygame_menu.Menu(
    'Rotation',
    1000, 800,
    onclose=pygame_menu.events.BACK
)

speed_values_discrete = {0: 'Stopped', 2: '', 5: '', 10: '', 20: '', 30: 'Fastest'}
rotate_speed_range = rotation_menu.add.range_slider('Speed', 5, list(speed_values_discrete.keys()),
    slider_text_value_enabled=False,
    value_format=lambda x: speed_values_discrete[x]
)


menu = pygame_menu.Menu(
    'Configuration',
    1000, 800,
    enabled=False,
    onclose=pygame_menu.events.CLOSE
)

menu.add.button('Rotation', rotation_menu)
menu.add.button('Colors')


def main():
    rotation = 0
    rpf = 5
    move = False
    x, y = 0, 0
    pos = (0, 0)
    img_size = 300
    img = pygame.transform.scale(pygame.image.load('img.png'), (img_size, img_size))

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT or (e.type == pygame.KEYDOWN and e.key == pygame.K_q):
                pygame.quit()
                exit(1)
            elif e.type == pygame.MOUSEBUTTONDOWN:
                menu.enable()
            elif e.type == pygame.MOUSEMOTION and move:
                pos = e.pos
                x = pos[0] - (img_size / 2)
                y = pos[1] - (img_size / 2)

        scrn.fill((0, 0, 0))
        rotated = pygame.transform.rotate(img, rotation)
        rotation += rpf
        new_rect = rotated.get_rect(center=img.get_rect(topleft=(x, y)).center)
        scrn.blit(rotated, new_rect)

        if menu.is_enabled():
            menu.update(events)
            menu.draw(scrn)

        pygame.display.update()
        clock.tick(60)


if __name__ == '__main__':
    main()

错误:

Traceback (most recent call last):
  File "C:\Users\Zer0\Documents\Spinner\main.py", line 80, in <module>
    main()
  File "C:\Users\Zer0\Documents\Spinner\main.py", line 73, in main
    menu.draw(scrn)
  File "C:\Users\Zer0\AppData\Local\Programs\Python\Python311\Lib\site-packages\pygame_menu\menu.py", line 2053, in draw
    self._current._runtime_errors.throw(self._current._runtime_errors.draw, 'menu is not enabled')
  File "C:\Users\Zer0\AppData\Local\Programs\Python\Python311\Lib\site-packages\pygame_menu\menu.py", line 4090, in throw
    raise RuntimeError(msg)
RuntimeError: menu is not enabled

程序应该旋转图像。单击屏幕时,将打开一个设置菜单。您可以进入旋转设置等子菜单并进行更改。我遇到的问题是如何使用旋转设置菜单中的 RangeSlider 更改旋转速度变量 (rpf)?

我遇到的另一个问题是当我关闭菜单时,我收到上面的错误,指出菜单未启用。这很令人困惑,因为该函数必须通过检查来查看它是否已启用,而它确实做到了。然后立刻就有问题了,因为没有启用!这真令人沮丧。

您能帮助我解决这两个问题的任何方法都会有帮助!谢谢你。

python user-interface pygame menu pygame-menu
1个回答
0
投票

您收到的错误是因为您尝试在未启用菜单时绘制菜单。您已将菜单设置为仅在按下鼠标按钮时启用,但每次在主循环中都调用 menu.draw(scrn) 方法。当鼠标按钮未按下时,这会导致运行时错误。

要解决此问题,您需要在绘制菜单之前检查菜单是否已启用。您可以使用 menu.is_enabled() 方法来执行此操作。例如,您可以像这样更改代码:

    # ...
if menu.is_enabled():
    menu.update(events)
    menu.draw(scrn) # draw only when enabled

pygame.display.update()
clock.tick(60)

这样,您将避免错误并仅在菜单处于活动状态时绘制菜单。

我希望这对您的 pygame 项目有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.