我的 pyglet 应用程序无法显示其他幻灯片

My pyglet application cant show other slides

我是 pyglet 的新手,但需要快速学习它才能完成学校项目。基本上,我有第一张带有图像菜单和预览的幻灯片,第二张幻灯片上有 end_screen 图像。第一张幻灯片的显示效果很好,但程序不会让我在按下某个键时转换到第二张幻灯片。没有错误消息,当我尝试绘制第二张幻灯片时它什么也没做。

import pyglet
from pyglet.window import key
import time
slide = 1
preview_image = pyglet.image.load('untitled (3).jpg')
menu_image = pyglet.image.load('untitled (4).jpg')
end_screen_image = pyglet.image.load('untitled (5).jpg')
preview = pyglet.sprite.Sprite(preview_image, x=0, y=0)
menu = pyglet.sprite.Sprite(menu_image, x=540, y=0)
end_screen = pyglet.sprite.Sprite(end_screen_image, x=270, y=0)
window = pyglet.window.Window(1180, 630)
def update():
    global menu
    global window
    global preview
    global end_screen
    global slide
    if slide == 1:
        window.clear()
        preview.draw()
        menu.draw()
    elif slide == 2:
        window.clear()
        end_screen.draw()
@window.event
def on_key_press(symbol, modifiers):
    global slide
    slide = 2
    update()
@window.event
def on_draw():
    window.clear()
    preview.draw()
    menu.draw()
pyglet.app.run()

出于某种原因,它无法正常工作。我尝试了不同种类的更新功能,但其中 none 都有效。提前致谢!

这里的主要问题是 update 的概念以及您通常期望代码如何执行。
我猜你习惯于在编写代码时被称为 ,这意味着你认为 "If I press a button, I want update() to be called instead"。部分是这样。

您遇到的问题是 Pyglet 试图尽可能快地呈现事物,并且它通过根据需要经常调用 on_draw() 来实现。因此,当您执行 update() 时 - 几分之一秒后 on_draw() 将被再次调用,一次又一次……一次又一次。 on_draw 中的第一行是 window.clear() - 它清除了 window 和 update() 中所做的任何更改。希望这是有道理的。

相反,您可能希望在每个渲染 on_draw 中使用您的 "which thing am i showing"-逻辑。虽然这会很慢,但希望这能传达自动渲染过程如何工作的逻辑,以及为什么你的学校作业逻辑不一定能很好地转化为有 "background tasks" 运行.[=30 的项目=]

import pyglet
from pyglet.window import key
import time

preview = pyglet.sprite.Sprite(pyglet.image.load('untitled (3).jpg'), x=0, y=0)
menu = pyglet.sprite.Sprite(pyglet.image.load('untitled (4).jpg'), x=540, y=0)
end_screen = pyglet.sprite.Sprite(pyglet.image.load('untitled (5).jpg'), x=270, y=0)
window = pyglet.window.Window(1180, 630)

@window.event
def on_key_press(symbol, modifiers):
    global slide
    slide = 2

@window.event
def on_draw():
    window.clear()
    if slide == 1:
        window.clear()
        preview.draw()
        menu.draw()
    elif slide == 2:
        window.clear()
        end_screen.draw()

pyglet.app.run()

哦,顺便说一句,不需要 global 函数中的变量,例如 update() 函数。除非你给变量赋值(menu = ...),否则默认情况下它们将是全局的 (例如,请参阅 on_key_press,其中你将 slide 更新为 slide = 2,在那些情况下你需要先全球化)。只是一个友好的提醒,全局范围在 Python 中是如何工作的,它的功能 - 给你更多的回旋余地来写更少的代码并实现同样的事情。所以请记住,= 意味着您需要将它们设置为全局的,否则请不要打扰:)

我也做了一点代码 "smaller",因为你没有使用 preview_image 我继续将图像加载结果直接传递到 Sprite() for preview 例如,节省了 3 行代码,可以说它的代码略少,因此更具可读性。这只是个人喜好问题,如果您愿意,可以将其还原。