资讯专栏INFORMATION COLUMN

pygame.error: font not initialized的解决及init()到底干了什么

yunhao / 3725人阅读

摘要:结果在安装完之后,安装也要安装之后,运行常规的测试函数返回的数字是,排除问题的方法就是把已知可以的子模块都先运行掉。说了这么多,它到底了哪些子模块我把官网上面的里介绍的所有带有的子模块都运行了一遍。

环境
Python3.6.8
pygame1.9.4

贴上报错源码:
import pygame
my_font = pygame.font.SysFont("arial", 16)
my_font = pygame.font.Font("my_font.ttf", 16)
报错内容:
Traceback (most recent call last):
  File "C:UsersHaoziHuangDesktoppygame44.py", line 6, in 
    my_font = pygame.font.SysFont("arial", 16)
  File "D:
jyjPythonpython3.6.8libsite-packagespygamesysfont.py", line 320, in SysFont
    return constructor(fontname, size, set_bold, set_italic)
  File "D:
jyjPythonpython3.6.8libsite-packagespygamesysfont.py", line 243, in font_constructor
    font = pygame.font.Font(fontpath, size)
pygame.error: font not initialized

不管先执行哪一个字体语句都会报错,
当发生此错误时
这时我们该检查
程序开始部分是否缺少pygame的初始化语句pygame.init()
而我们想问了, pygame.init()到底初始化个啥呀???
这个问题问得好!

以下内容转载自:简明现代魔法, 感谢大佬的分享 你究竟有(init)几个好(子)妹(模)妹(块)? 当我们在init()的时候,我们在干什么

init 这个单词在我们用python进行面向对象开发的时候是跑不了的。理解python的__init__()其实就是和这里的init()作用差不多。做的工作都是__初始化__.至于他在干什么,我的解释是这样的:

我们已经知道python有一个特殊的“工具包(模块)”叫pygame了。在我们要动手用它完成我们的想法之前,电脑这个强迫症需要我们检查一遍,这个工具包是否完整,能否正常给我们提供帮助。而这个检查的动作,就是pygame.init()
那么init()实际上检查了哪些东西呢?

这个其实也不难实验。直接在shell里面,我执行了这个函数:

>>> import pygame
>>> pygame.init()
(6, 0)

不明所以的,他给了我一个元组(6,0),我也很不理解,这个6和0分别代表什么意思。所以查阅了pygame的官方文档

initialize all imported pygame modules

init() -> (numpass, numfail)

Initialize all imported pygame modules. No exceptions will be raised if a module fails, but the total number if successful and failed inits will be returned as a tuple. You can always initialize individual modules manually, but pygame.init() is a convenient way to get everything started. The init() functions for individual modules will raise exceptions when they fail.

You may want to initialize the different modules separately to speed up your program or to not use things your game does not.

It is safe to call this init() more than once: repeated calls will have no effect. This is true even if you have pygame.quit() all the modules.

初始化所有导入的pygame模块。如果模块失败,则不会引发异常,但如果成功且失败的总数将作为元组返回。您可以随时手动初始化单个模块,但pygame.init()初始化所有导入的pygame模块是一种方便的方法来启动所有内容。各个模块的init()函数会在失败时引发异常。

您可能希望多带带初始化不同的模块以加速您的程序或不使用您的游戏没有的东西。

不止一次调用此init()是安全的:重复调用将不起作用。即使你有pygame.quit()所有模块也是如此。

关于init()的一个意外的实验

我以前从来没有深究过pygame.init()这个函数究竟init了哪些模块,仅仅在实践的过程中知道,音频播放和创建文字字体的时候,如果没有init就会报错。

今天我在安装我的新的电脑环境的时候,因为不知道电脑的型号,所以并没有特意去搜索和安装电脑对应的驱动。结果在安装完python之后,安装pygame(wheel也要安装)之后,运行常规的测试函数pygame.init()返回的数字是(5,1)

排除问题的方法就是把已知可以init()的子模块都先运行掉。经过排查,发现pygame无法调用声卡驱动。剩下的事情就好办很多了,重新安装一下声卡驱动,重启之后就可以正常init了。

但是在这个过程中,我可以得出比以前更加接近实际的一个结论:

pygame.init()在做的,其实就是检查,电脑上一些需要的硬件调用接口、基础功能是否有问题。如果有,他会在程序运行之前就反馈给你,方便你进行排查和规避。

说了这么多,它到底init了哪些子模块
>>> import pygame
>>> pygame.init()
(6, 0)

>>> pygame.display.init()
>>> pygame.font.init()
>>> pygame.joystick.init()
>>> pygame.mixer.init()

>>> pygame.scrap.init()
Traceback (most recent call last):
  File "", line 1, in 
pygame.error: No display mode is set

>>> pygame.freetype.init()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: module "pygame" has no attribute "freetype"
>>> pygame.midi.init()
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: module "pygame" has no attribute "midi"
>>> pygame.cdrom.init()

我把pygame官网上面的doc里介绍的所有带有init的子模块都运行了一遍。

其中midifreetype这两个模块已经没有了(吐槽一下官方的文档吧,都没了还放着嘛)。

scrap初始化失败是因为没有窗口。这样的话,其实已经有5个模块是被初始化了。但是scrap在没有窗口的情况下会报错,到底算不算一个init。还需要后面再仔细看看文档和源码吧。

That"s all!再次感谢这位大佬的分享!

附上官方文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43216.html

相关文章

  • 当我们谈论Virtual DOM时,我们在说什么——etch源码解读

    摘要:接下来我们深入函数,看看它干了什么。在我们写的代码里,我们会手动将元素挂载到树上。到这里,我们已经完成了元素挂载的全过程,接下来我们看一看更新的时候会发生什么。这部分应该是负责的,我们要在组件的方法中调用。 etch简介 首先我们有必要介绍一下etch。 etch是atom团队下的开源项目,是一套非常简洁然而功能十分完善的virtualDOM机制。我在偶然的情况下接触到了这个开源项...

    RayKr 评论0 收藏0
  • SpringIoc源码解析

    摘要:重要的会在后面拎出来单独详解加锁,防止在过程中,重启或销毁造成不必要的问题准备此上下文以进行刷新,设置其启动日期和,活动标志以及执行属性源的任何初始化,校验配置文件。以后所有的相关的操作其实是委托给这个实例来处理的。 1、先上测试代码 public static void main(String[] args){ //配置文件来启动一个 ApplicationContext App...

    dack 评论0 收藏0
  • Python学习之路13-记分

    摘要:之所以这里要添加这四行代码,其实是为了当你重新开始也就是第二次及以后点击按钮游戏时,计分板能正确显示。当第一运行游戏时,没有这四行也能正确显示计分板。 《Python编程:从入门到实践》笔记。本篇是Python小游戏《外星人入侵》的最后一篇。 1. 前言 本篇我们将结束Pygame小游戏《外星人入侵》的开发。在本篇中,我们将添加如下内容: 添加一个Play按钮,用于根据需要启动游戏以...

    tommego 评论0 收藏0
  • SpringCloud(第 050 篇)Netflix Eureka 源码深入剖析(下)

    摘要:于是我们继续断点往下走,发现对象里面只有一个类名路径为。进入看看,这个配置类有哪些重要的方法。。。分析一果不其然,方法被调用了,紧接着也进入断点,然后在往下走,又进入的方法中的回调处。 SpringCloud(第 050 篇)Netflix Eureka 源码深入剖析(下) - 一、大致介绍 1、鉴于一些朋友的提问并提议讲解下eureka的源码分析,由此应运而产生的本章节的内容; 2、...

    xiaoqibTn 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<