我的 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 行代码,可以说它的代码略少,因此更具可读性。这只是个人喜好问题,如果您愿意,可以将其还原。
我是 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 行代码,可以说它的代码略少,因此更具可读性。这只是个人喜好问题,如果您愿意,可以将其还原。