2017-01-19 2 views
-1

Je travaille sur une interface graphique simple en utilisant pygame. À un certain point, j'en avais marre des erreurs d'indentation constantes dues au mélange d'onglets et d'espaces, alors j'ai décidé d'utiliser vi pour remplacer tous les onglets par 4 espaces. Après cela, je reçois une erreur à propos de pygame.font.SysFont n'étant pas initialisé, même si c'était avant. Naturellement, je pense que cela a quelque chose à voir avec moi en changeant simplement les tabulations pour les espaces, donc je m'assure que tout est correctement mis en retrait etc. Je commente 95% du code et commence à comparer avec une ancienne version du code. ancien code à la nouvelle. Puisqu'ils semblent être identiques (en utilisant cat -A file.py pour comparer aussi les caractères invisibles).Erreur étrange lors de l'utilisation d'espaces au lieu de tabulation en Python

Je trouve enfin que c'est le coupable: trouble-maker

Ceci est la seule chose (ce n'est pas entre guillemets triples) qui est différent entre les deux fichiers. Changer cette ligne pour avoir un onglet résout effectivement le problème. Donc, problème résolu, je suppose. La question est: Comment est-ce possible? Les espaces ne devraient-ils pas être moins sujets aux erreurs que les tabulations?

Le code ressemble à ceci:

import pygame 
pygame.init() 

class GameMenu(): 
    def __init__(self, screen, items, bg_color=(237,237,223), font="Verdana", font_size=30, 
       font_color=(237, 28, 36)): 
     self.screen = screen 
     self.scr_width = self.screen.get_rect().width 
     self.scr_height = self.screen.get_rect().height 

     self.bg_color = bg_color 
     self.clock = pygame.time.Clock() 

     self.items = items 
     self.font = pygame.font.SysFont(font, font_size) 
     self.font_color = font_color 
     """ 
     rest of the code commented out 
    """  
    pygame.quit() 

if __name__ == "__main__": 
    screensize = 0 
    screen = pygame.display.set_mode((640, 480), screensize, 32) 

    menu_items = ('1', '2', '3', '4', '5') 

    pygame.display.set_caption('numbers') 
    pygame.mouse.set_visible(True) 
    gm = GameMenu(screen, menu_items) 

Qu'est-ce que je manque ici? Pourquoi un onglet pygame.quit avant() travailler, mais sans 4 espaces, il donne « pygame.error: police non initialisé »

EDIT: Voici le retraçage

Traceback (most recent call last): 
    File "testMenu.py", line 168, in <module> 
     gm = GameMenu(screen, menu_items) 
     File "testMenu.py", line 31, in __init__ 
      self.font = pygame.font.SysFont(font, font_size) 
       File "/usr/lib/python2.7/dist-packages/pygame/sysfont.py", 
       line 614, in SysFont 
        return constructor(fontname, size, set_bold, 
        set_italic) 
        File 
        "/usr/lib/python2.7/dist-packages/pygame/sysfont.py", line 537, in font_constructor 
         font = pygame.font.Font(fontpath, size) 
         pygame.error: font not initialized 

S'il vous plaît noter également qu'il ne soit pas tenu de le faire pygame.font.init(), voir https://www.pygame.org/docs/tut/ImportInit.html

+0

Pouvez-vous fournir le retraçage, etc.? (La sortie de l'interpréteur montre). –

+0

Les tabulations sont [8 espaces en Python, pas en 4] (https://docs.python.org/2/reference/lexical_analysis.html#indentation). – wildwilhelm

+0

Est-ce que 'pygame.quit()' est supposé être dans la méthode '__init__'? FWIW, Python utilise des tabulations fixes de taille 8. –

Répondre

2

Si vous mettez pygame.quit() sans onglet, vous avez quelque chose comme th est

(il n'a pas d'importance que vous avez class entre init() et quit() - cela fonctionne de la même manière)

import pygame 

pygame.init() 
pygame.quit() 

class ... 

if __name__ == "__main__": 
    screensize = 0 
    screen = pygame.display.set_mode((640, 480), screensize, 32) 

    menu_items = ('1', '2', '3', '4', '5') 

    pygame.display.set_caption('numbers') 
    pygame.mouse.set_visible(True) 
    gm = GameMenu(screen, menu_items) 

Vous init pygame et à la fois que vous quittez pygame - et vous obtenez votre erreur lorsque vous essayez d'utiliser des éléments de pygame (comme font).

Vous devriez le faire à l'intérieur if __name__ == "__main__": à la place correcte.

import pygame 

class ... 

if __name__ == "__main__": 

    # starts program 
    pygame.init() 

    screensize = 0 
    screen = pygame.display.set_mode((640, 480), screensize, 32) 

    menu_items = ('1', '2', '3', '4', '5') 

    pygame.display.set_caption('numbers') 
    pygame.mouse.set_visible(True) 
    gm = GameMenu(screen, menu_items) 

    # ... other code ... 

    # ends program 
    pygame.quit() 

BTW: cela peut être plus utile (au lieu de scr_width, scr_height)

self.screen_rect = self.screen.get_rect() 

parce que vous pouvez toujours obtenir self.screen_rect.width, self.screen_rect.height et aussi self.screen_rect.center (à élément central à l'écran), ou autres.

-1

pygame.font.init() est nécessaire pour utiliser les polices

+1

S'il vous plaît expliquer votre réponse réponses cryptiques ne sont pas très utiles dans SO – Jeet

+1

Ce n'est pas réellement nécessaire, voir https://www.pygame.org/docs/tut/ImportInit.html –