2016-02-27 4 views
0

У меня была следующая проблема: первый раз, когда эта метка отображается правильно, но в следующий раз я получаю только пустое черное окно.Пустое окно в 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, как я могу это исправить? Спасибо!

ответ

0

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

Смежные вопросы