2016-05-20 1 views
1
#!/usr/bin/python3 

import pyglet 

window = pyglet.window.Window() 
label = pyglet.text.Label("Hello World!", 
          font_name="Times New Roman", 
          color=(255,255,255,255), 
          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() 

Ce code est extrait du tutoriel pyglet à https://pyglet.readthedocs.io/en/pyglet-1.2-maintenance/programming_guide/quickstart.html mais quand exécuter ne tire pas l'étiquette jusqu'à ce qu'une touche est enfoncée. J'ai ajouté la couleur car je pensais que le texte pouvait avoir par défaut noir. Est-ce que je manque quelque chose de vraiment évident pour expliquer pourquoi ce comportement est en train de se produire? OK, ayant eu ma mémoire jogged par les commentaires, j'ai installé les polices MS et il fonctionne maintenant en python 2.x mais j'ai encore besoin d'appuyer sur une touche pour voir le texte en python 3. Peut-être que la police est un rouge-hareng et il y a une certaine incompatibilité avec python 3.Pyglet bonjour exemple du monde ne montre pas l'étiquette jusqu'à ce qu'une touche est pressée

+0

Êtes-vous 100% sûr que c'est le code que vous utilisez? Parce que ce code fonctionne comme prévu sur ma configuration https://youtu.be/Yc_25-CxAak - Versions Python: 3.5.1/Pyglet: 1.2.2 – Torxed

+0

Vous avez tagué cette question avec "Ubuntu" même si vous êtes essayer de charger pyglet avec "Times New Roman", était-ce exprès? Parce que TNR n'existe pas sous Linux par défaut. – Torxed

+0

Techniquement Kubuntu mais il s'avère que j'avais oublié d'installer les polices Microsoft. Je savais que ce serait une chose simple. – Elija

Répondre

1

Comme mentionné dans les commentaires.
La plupart des exemples trouvés sur Internet (même la plupart des guides) supposent une plate-forme Windows.

S'il existe une déclaration font= avec une police Windows mais que vous exécutez Linux, assurez-vous que les polices appropriées sont installées ou revenez à une police installée.

$ fc-list 

également ne pas déclarer une police travaillera aussi:

label = pyglet.text.Label("Hello World!", 
          color=(255,255,255,255), 
          font_size=36, 
          x=window.width//2, y=window.height//2, 
          anchor_x="center", anchor_y="center") 

Parce que Pyglet sera par défaut sans-serif:

Si vous ne vous souciez pas particulièrement que la police est utilisée, et juste besoin d'afficher du texte lisible, vous pouvez spécifier None comme nom de famille, ce qui va charger une police sans-serif par défaut (Helvetica sur Mac OS X, Arial sur Windows XP)

Votre problème est probablement que vous ne mettez pas à jour manuellement l'écran après avoir dessiné quelque chose. Normalement, lorsque vous appuyez sur une touche, cela force window.flip(), ce qui signifie essentiellement mettre à jour le contenu de l'écran.
window.clear() déclenche également ce comportement, mais pas x.draw(). Pourquoi? Eh bien la chose qui prend du temps en infographie n'est pas vraiment les calculs, c'est la mise à jour à l'écran qui prend du temps .. Là pour .draw() ne met pas à jour l'écran, il met juste les trucs dans le buffer graphique ("page"), vous décidez quand retourner la page et afficher le nouveau tampon sur l'écran.

Essayez ceci:

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

Cela pourrait être une solution surpuissant, mais il résoudra probablement le problème.
Cela remplace la boucle par défaut de pyglet et le comportement de dessin par défaut, c'est aussi l'une des classes que j'utilise le plus dans mes projets pyglet car elle me donne l'option de créer mon propre framework.

import pyglet 

class Window(pyglet.window.Window): 
    def __init__(self): 
     super(Window, self).__init__(vsync = False) 
     self.sprites = {} 
     self.sprites['testlabel'] = label = pyglet.text.Label("Hello World!", 
         color=(255,255,255,255), 
         font_size=36, 
         x=self.width//2, y=self.height//2, #self here, being pyglet.window.Window that we've inherited and instanciated with super(). 
         anchor_x="center", anchor_y="center") 
     self.alive = 1 

    def on_draw(self): 
     self.render() 

    def render(self): 
     self.clear() 
     for sprite_name, sprite_obj in self.sprites.items(): 
      sprite_obj.draw() 
     self.flip() 

    def on_close(self): 
     self.alive = 0 

    def run(self): 
     while self.alive: 
      self.render() 
      # This is very important, this queries (and empties) 
      # the pyglet event queue, if this queue isn't cleared 
      # pyglet will hang because it can't input more events, 
      # and a full buffer is a bad buffer, so we **NEED** this! 
      event = self.dispatch_events() 

win = Window() 
win.run() 

Il est extrêmement basique, mais vous pouvez ajouter plus de sprites, les objets et les rendre à def render(self):.

+1

C'est une réponse fantastique. Je vous remercie. Il y a une faute de frappe dans votre code: 'sprite.obj.draw()' devrait être 'sprite_obj_draw()' à part ça, ça marche très bien. Ajout du flip() dans le code d'origine n'a pas fonctionné jusqu'à ce que j'ai changé 'window = pyglet.window.Window()' à 'window = pyglet.window.Window (vsync = False)' – Elija

+0

@ Elija Parfait, changé mon code à 'sprite_obj.draw()'. Je vous remercie de le faire remarquer! En ce qui concerne la chose 'vsync = False', c'est un bon point. Je vais l'expérimenter et voir si je peux mettre à jour la documentation officielle s'il s'avère que cela fonctionne mieux avec la population générale. Je vais aussi changer pour qu'une police spécifique ne soit pas définie dans le premier exemple de Hello World car cela pourrait causer des problèmes avec les utilisateurs multi-plateformes. – Torxed