在Pyglet的空窗口

时间:2016-02-27 21:57:40

标签: python opengl pyglet

我遇到了以下问题 - 第一次正确显示编译此标签,但下次我只获得一个空的黑色窗口。

import pyglet
window = pyglet.window.Window()

label = pyglet.text.Label('Hello, world',
                          font_name='Times New Roman',
                          font_size=36,
                          x=window.width//2, y=window.height//2,
                          anchor_x='center', anchor_y='center')

@window.event
def on_draw():
    window.clear()
    label.draw()

pyglet.app.run()

我使用python 3.4,我该如何修复它?谢谢!

1 个答案:

答案 0 :(得分:0)

此代码实际上使用Pyglet 1.2.2运行Python 3.5.1 但是,尝试添加手动帧缓冲区将导致黑色窗口。

import pyglet
window = pyglet.window.Window()

label = pyglet.text.Label('Hello, world',
                          font_name='Times New Roman',
                          font_size=36,
                          x=window.width//2, y=window.height//2,
                          anchor_x='center', anchor_y='center')

@window.event
def on_draw():
    window.clear()
    label.draw()
    window.flip()  # <-- New addition

pyglet.app.run()

我认为这一切归结为图形缓冲区中的计时问题,在您看到文本再次被清除之前,事情可能会更新。

因此,为了避免这种情况,我将粘贴一个最小的示例,说明如何在自己的自定义类中继承pyglet窗口类,您可以在其中调用事件并自行重新绘制。

import pyglet

class base(pyglet.window.Window):
    def __init__(self):
        super(base, self).__init__(600, 600, fullscreen = False)

        self.alive = 1
        self.label = pyglet.text.Label('Hello, world',
                          font_name='Times New Roman',
                          font_size=36,
                          x=self.width//2, y=self.height//2,
                          anchor_x='center', anchor_y='center')
    def on_draw(self):
        self.render()

    def render(self):
        self.clear()
        self.label.draw()
        self.flip()

    def on_close(self):
        self.alive = 0

    def on_key_press(self, symbol, modifiers):
        if symbol == pyglet.window.key.ESCAPE: # [ESC]
            self.alive = 0

    def run(self):
        while self.alive == 1:
            self.render()

            # -----------> This is key <----------
            # This is what replaces pyglet.app.run()
            # but is required for the GUI to not freeze
            #
            event = self.dispatch_events()

x = base()
x.run()

此代码也比使用装饰器用于许多调整的标准方法更有效,但最重要的是它似乎可以解决您发现的时序问题。