在Python中使用空格而不是制表符时出现奇怪的错误

在Python中使用空格而不是制表符时出现奇怪的错误,python,tabs,pygame,spaces,Python,Tabs,Pygame,Spaces,我正在使用pygame开发一个简单的GUI。在某个时候,由于制表符和空格的混合,我对不断的缩进错误感到厌烦,所以我决定用vi将所有制表符替换为4个空格。在那之后,我得到了一些关于pygame.font.SysFont没有被初始化的错误,即使它是以前的。 当然,我认为这与我只是将制表符改为空格有关,因此我确保所有内容都正确缩进等。我注释掉95%的代码,并开始与旧版本的代码进行比较,将旧代码中的行复制到新代码中。因为它们看起来是相同的(使用cat-A file.py也比较不可见的字符) 我终于发现这

我正在使用pygame开发一个简单的GUI。在某个时候,由于制表符和空格的混合,我对不断的缩进错误感到厌烦,所以我决定用vi将所有制表符替换为4个空格。在那之后,我得到了一些关于pygame.font.SysFont没有被初始化的错误,即使它是以前的。 当然,我认为这与我只是将制表符改为空格有关,因此我确保所有内容都正确缩进等。我注释掉95%的代码,并开始与旧版本的代码进行比较,将旧代码中的行复制到新代码中。因为它们看起来是相同的(使用cat-A file.py也比较不可见的字符)

我终于发现这是罪魁祸首:

这是两个文件之间唯一不同的内容(不在三重引号中)。将此行更改为具有选项卡确实可以解决问题。 所以,我想问题解决了

我的问题是: 这怎么可能?空格不应该比选项卡更容易出错吗

代码如下所示:

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)
我错过了什么?为什么pygame.quit()前面的选项卡可以工作,但如果没有4个空格,它会给出“pygame.error:字体未初始化”

编辑:这是回溯

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
回溯(最近一次呼叫最后一次):
文件“testMenu.py”,第168行,在
gm=游戏菜单(屏幕、菜单项)
文件“testMenu.py”,第31行,在_init中__
self.font=pygame.font.SysFont(字体,字体大小)
文件“/usr/lib/python2.7/dist-packages/pygame/sysfont.py”,
第614行,SysFont格式
返回构造函数(字体名称、大小、设置粗体、,
设置(斜体)
文件
“/usr/lib/python2.7/dist packages/pygame/sysfont.py”,第537行,在font\u构造函数中
font=pygame.font.font(字体路径,大小)
pygame.error:字体未初始化

还请注意,不需要执行pygame.font.init(),请参见

pygame.font.init()来使用字体

如果您在没有选项卡的情况下放置
pygame.quit()
,则您有类似的功能

(在
init()
quit()
之间有
class
并不重要-其工作方式相同)

因此,您初始化
pygame
,然后立即退出
pygame
——当您尝试使用
pygame
的某些元素时,会出现错误(如
font

您应该在
中的正确位置执行此操作

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

顺便说一句:这可能更有用(而不是
scr\u宽度
scr\u高度


因为你总是可以得到
self.screen\u-rect.width
self.screen\u-rect.height
,还有
self.screen\u-rect.center
(到屏幕上的中心元素)或其他信息。

你能提供回溯,等等吗。?(解释器显示的输出)。选项卡是。那
pygame.quit()
应该在
\uuuu init\uuu
方法中吗?FWIW,Python使用大小为8的固定制表位。有关详细信息,请参阅Python语言词法分析部分的第2段Reference@PM2Ring它不应该在
\uuuu init\uuuu
方法中,它应该在GameMenu类的末尾。有趣的是,你和Wildwillhelm提出的是8个空格,因为这与请解释你的答案相矛盾。神秘的答案不是很有用,所以实际上不需要,请参见
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()
self.screen_rect = self.screen.get_rect()