Kivy中显示汉字的问题
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()
...
4. 效果

Kivy中显示汉字的问题的更多相关文章
- 逆向project第004篇:令计算器程序显示汉字(下)
一.前言 钩子技术是一项很有有用价值的技术.在Windows下HOOK技术的方法比較多,使用比較灵活,常见的应用层的HOOK方法有Inline HOOK(详见<反病毒攻防研究第012篇:利用In ...
- VB6单片机编程中的汉字处理
在DOS时代,拥有一个华丽的汉字菜单几乎是每个高档中文应用程序必须的包装.中文Windows操作系统的出现使得高级开发平台实现全中文的提示和界面非常容易和方便.在一般的应用程序中已经很少需要去专门考虑 ...
- 将汉字取模软件中的汉字放到keil5中显示
最近因为要使用STM32做毕业设计,需要用LCD显示中文,STM32开发板用的是原子的战舰STM32开发板,给的LCD显示例程里貌似没有中文显示,那么需要自己去编写中文显示程序. 软件编写对我来说并不 ...
- Protel中放置汉字工具的使用图示
首先先到网上下载Protel中放置汉字工具ProtelHz.然后把ProtelHz中的文件全部解压到Protel99se安装目录X:\Program Files\Design Explorer 99 ...
- OpenGL------在Windows系统中显示文字
增加了两个文件,showline.c, showtext.c.分别为第二个和第三个示例程序的main函数相关部分.在ctbuf.h和textarea.h最开头部分增加了一句#include <s ...
- 2.数码相框-编码(ASCII/GB2312/Unicode)介绍,并使LCD显示汉字字符(2)
在上章-学习了数码相框的框架分析(1)了 本章主要内容如下: 1)熟悉ASCII/GB2312/Unicode编码 2)写应用程序,使LCD显示汉字和字符 大家都知道,数据传输的是二进制,而字符和汉字 ...
- 使用Tslib在触摸屏上显示汉字【转】
转自:http://www.latelee.org/embedded-linux/use-tslib-to-display-chinese-character.html 终于到了在触摸屏上显示汉字了, ...
- activiti部署到linux后流程图不显示汉字的问题
linux和windows的字体文件一般是不一样的,默认情况下,linux的java7中一般不支持中文,activiti的动态流程图中的汉字需要java调用汉字的字库,这里需要配置一下java的汉字字 ...
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
js replace 全局替换 js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...
随机推荐
- 基于UDP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按 ...
- Python2 与 Python3 的区别
python解释器默认编码(python2与python3的区别一) python2 解释器默认编码:ascii python3 解释器默认编码:utf-8 输入(python2与python3的区别 ...
- predixy源码学习
Predixy是一个代理,代理本质上就是用来转发请求的.其主要功能就是接收客户端的请求,然后把客户端请求转发给redis服务端,在redis服务端处理完消息请求后,接收它的响应,并把这个响应返回给客户 ...
- Scrapy爬虫框架基本使用
scrapyhub上有些视频简单介绍scrapy如何学习的(貌似要FQ):https://helpdesk.scrapinghub.com/support/solutions/articles/220 ...
- HDU1300Pearls
传送门 描述: 有几种不同的珍珠.每种珍珠都有它的单价.当然质量高的珍珠价格一定也是高的. 为了避免买家只买1个珍珠.就要求不论是买了多少个珍珠都是需要在购买数量上加10.之后乘上单价. 例如:买5个 ...
- [LiDAR数据模拟]系列(2) HELIOS的TLS点云模拟流程
关键词:地基激光雷达 点云模拟 XML文件 作者:李二 日期:07/05/2020 - 08/05/2020 我目前仅仅使用了TLS模式进行模拟,所以先讲一下TLS的模拟经验. ALS和MLS的模拟, ...
- 记一次面试过程中的Python编程题
这几天面试过程中遇到一道Python编程题,题目如下: 面试中遇到一个Python编程问题:一个字符串,将里面的数字取出来,如果第一个数字前面是+,表示整个数字为正数,如果第一个数字前面是-,表示数字 ...
- asp.net core计划任务探索之hangfire+redis+cluster
研究了一整天的quartz.net,发现一直无法解决cluster模式下多个node独立运行的问题,改了很多配置项,仍然是每个node各自为战.本来cluster模式下的各个node应该是负载均衡的, ...
- python语法学习第十天--类与对象相关的BIF、魔法方法
一些相关的BIF: issubclass(class,classInfo)#判断是否为子类,classInfo可以为多个类的元组,其中一个是,返回true,一个类也被认为是自己的子类,object是所 ...
- python语法学习第九天--else和with语句
else: while/for else:正常执行完循环(非break)执行else中代码 try else:未捕捉到异常,执行else中代码 with: 语法格式: with open('666.t ...