Этот код фактически работает под управлением 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()
Этот код также является более эффективным, чем стандартный способ использования декораторов для ряда resons, но большинство imporantly это, кажется, работает вокруг вопросов, касающихся сроков, которые вы обнаружили.