我正在制作一个pyGame程序,并决定使用pyGame菜单库中的一些简单的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)
Runtime错误: menu is not enabled

程序应该旋转一个图像.单击屏幕时,将打开设置菜单.你可以go 子菜单,如旋转设置和改变这些.我遇到的一个问题是,如何在旋转设置菜单中使用RangeSlider更改旋转速度变量(rpf)?(这个问题没有解决)

我遇到的另一个问题是,当我关闭菜单时,我收到上面的错误消息,指出菜单未启用.这很令人困惑,因为该函数必须通过判断来查看它是否被启用,它确实启用了.那么它就会立即出现问题,因为它没有启用!这太令人沮丧了.(此问题已解决)

推荐答案

拨打menu.update()可能会禁用菜单.当您点击菜单右上角的十字架时,就会发生这种情况.因此,在绘制带有menu.draw(scrn)的菜单之前,必须判断是否启用了带有menu.is_enabled()的菜单:

while True:
    events = pygame.event.get()
    for e in events:
        # [...]

        elif e.type == pygame.MOUSEBUTTONDOWN:
            menu.enable()

    # [...]

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

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

Python相关问答推荐

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

ambda将时间戳与组内另一列的所有时间戳进行比较

Polars:使用列值引用when / then表达中的其他列

如何在BeautifulSoup中链接Find()方法并处理无?

比较两个数据帧并并排附加结果(获取性能警告)

根据在同一数据框中的查找向数据框添加值

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

数据抓取失败:寻求帮助

无法使用requests或Selenium抓取一个href链接

根据列值添加时区

计算分布的标准差

如何从列表框中 Select 而不出错?

* 动态地 * 修饰Python中的递归函数

为什么常规操作不以其就地对应操作为基础?

如何按row_id/row_number过滤数据帧

python的文件. truncate()意外地没有截断'

如何在信号的FFT中获得正确的频率幅值

每次查询的流通股数量

SpaCy:Regex模式在基于规则的匹配器中不起作用

查找查找表中存在的列值组合