我正在制作一个 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)?
我遇到的另一个问题是当我关闭菜单时,我收到上面的错误,指出菜单未启用。这很令人困惑,因为该函数必须通过检查来查看它是否已启用,而它确实做到了。然后立刻就有问题了,因为没有启用!这真令人沮丧。
您能帮助我解决这两个问题的任何方法都会有帮助!谢谢你。
您收到的错误是因为您尝试在未启用菜单时绘制菜单。您已将菜单设置为仅在按下鼠标按钮时启用,但每次在主循环中都调用 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 项目有所帮助。