Kivy中顯示漢字的問題


1. kivy中顯示中文亂碼和提示錯誤的原因:

  • 編碼問題
  • 字體問題

2. 字體問題的解決

可以下載支持中文的字體文件ttf,我這里使用了微軟雅黑中文簡體msyh.ttf。我們在編寫布局時可以直接在相關控件上指定字體類型

# 在py文件中的使用方式:
btn = Button(text='我的世界', font_name='msyh.ttf')

在kv文件中的使用方式:

Button:
    text: '我的世界'
    font_name: 'msyh.ttf'

但是這種方式很顯然是不可取的,因為有一個控件,就得為其指定字體類型名稱。我們想在程序運行時就加載注冊好字體類型,這就需要用到kivyLabelBase來提前注冊好字體類型

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. 效果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM