1. kivy中显示中文乱码和提示错误的原因:
- 编码问题
- 字体问题
2. 字体问题的解决
可以下载支持中文的字体文件ttf,我这里使用了微软雅黑中文简体msyh.ttf
。我们在编写布局时可以直接在相关控件上指定字体类型
# 在py文件中的使用方式: btn = Button(text='我的世界', font_name='msyh.ttf')
在kv文件中的使用方式:
Button: text: '我的世界' font_name: 'msyh.ttf'
但是这种方式很显然是不可取的,因为有一个控件,就得为其指定字体类型名称。我们想在程序运行时就加载注册好字体类型,这就需要用到kivy
的LabelBase
来提前注册好字体类型
from kivy.core.text import LabelBase LabelBase.register(name='Font_Hanzi',fn_regular='./fonts/msyh.ttf')
注册后如何使用呢?
# py文件中: btn = Button(text='我的世界', font_name='Font_Hanzi')
# kv文件中: Button: text: '我的世界' font_name: 'Font_Hanzi'
看起来是不是并没有减少代码量,其实不然,这样为程序提供了一个统一的变量供所有控件使用,方便很多了。
3. 解码报错问题
解码报错问题主要出现在py文件去读取kv文件的过程中,提示的错误类似UnicodeDecodeError: 'gbk' codec can't decode byte 0xba in position 171: illegal multibyte sequence
,报这个错误的原因很简单,就是主程序读取kv文件时的编码问题。
class ClockApp(App): def build(self): return Builder.load_file('./kvs/clock.kv')
Builder.load_file('./kvs/clock.kv')
这个方法是有问题的,那么如果解决问题呢?
我们可以直接查看源码
def load_file(self, filename, **kwargs): filename = resource_find(filename) or filename if __debug__: trace('Lang: load file %s' % filename) # 问题就出在open()方法上,它没有指明具体的编码格式 with open(filename, 'r') as fd: kwargs['filename'] = filename data = fd.read() ...
问题找到了,解决问题的方法就是直接改源代码,在open()
方法中加入encoding='utf-8'
关键字参数即可。
def load_file(self, filename, **kwargs): filename = resource_find(filename) or filename if __debug__: trace('Lang: load file %s' % filename) # 在open()方法中指明编码方式为utf-8 with open(filename, 'r', encoding='utf-8') as fd: kwargs['filename'] = filename data = fd.read() ...