我的pyglet应用程序不能显示其他幻灯片。

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

我是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()

出于某种原因,它只是不工作。我已经尝试了不同类型的更新功能,但他们都没有工作。先谢谢你了

python pyglet
1个回答
1
投票

这里的主要问题是 update 和你通常期望的代码执行方式。我猜你已经习惯了代码被称为 如你所言意思是说,你认为 "如果我按一个按钮,我想 update() 拟改名为". 部分是这样的。

你遇到的问题是,Pyglet试图尽可能快地渲染事物,它通过调用 on_draw() 只要需要就可以。所以当你执行 update() - 弹指一挥间 on_draw() 会被再次调用,再次... ... 再次。而你的第一行 on_drawwindow.clear() - 清理窗口和在 update(). 希望这有意义。

相反,你可能想让你的 "我在展示哪件东西 "的逻辑在你的脑海里。on_draw 每次渲染。虽然这会很慢,但希望这能传达自动渲染过程的工作逻辑,以及为什么你在学校作业中的逻辑不一定能很好地转化到有 "后台任务 "运行的项目中。

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 在那里你更新 slideslide = 2在这些情况下,你需要先进行全球化处理). 只是友好地提醒一下全局范围在Python和它的函数中是如何工作的--让你有更多的回旋余地来写更少的代码,实现同样的事情。所以请记住。= 意味着你需要把它们做成全局的,否则就别麻烦了:)

我还把代码做得更 "小 "一些,因为你没有使用 preview_image 我直接把图像加载结果传到了 Sprite() 对于 preview 比如说,节省了3行代码,使得它的代码可以说是略微少了一些,从而更容易读懂。这是个口味问题,如果你觉得喜欢,可以恢复。

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