Пустое окно в 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, как я могу это исправить? Спасибо!


person Belogurow    schedule 27.02.2016    source источник


Ответы (1)


Этот код действительно работает под управлением Python 3.5.1 с использованием Pyglet 1.2.2.
Однако попытка добавить буфер кадра вручную приведет к черному окну.

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

Этот код также более эффективен, чем стандартный способ использования декораторов по ряду причин, но, что наиболее важно, он позволяет обойти обнаруженные вами проблемы синхронизации.

person Torxed    schedule 22.03.2016