dearpygui 显示中文和特殊字符( 加载速度相当快 )

安装 dearpygui

1
pip install dearpygui

dearpygui显示中文和特殊字符

Code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# -*- coding: utf-8 -*-
#********************************************************************************
#Copyright © 2023 Wcq
#File Name: test_unicode.py
#Author: Wcq
#Email: wcq-062821@163.com
#Created: 2023-11-29 10:26:56 
#Last Update: 2023-11-29 10:37:40
#         By: Wcq
#Description: 
#********************************************************************************
import dearpygui.dearpygui as dpg
import re
dpg.create_context()
print(f"Ω Unicode : 0x{ord('Ω'):04x}")
print(f"ant Unicode : 0x{ord('🐜'):06x}")

def extract_chinese_text(file_path):
    ''' 从文件中提取出中文和部分特殊字符 '''
    print('file_path :', file_path)
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()
    # chinese_text = re.findall('[\u4e00-\u9fa5]+', content)   # chinese unicode
    # chinese_text += re.findall('[\u0300-\u0400]+', content)  # special symbol
    chinese_text = re.findall('[\u0300-\uffff]+', content)     # all
    chinese_list = set()
    for string in chinese_text:
        for c in string:
            chinese_list.add(c)
    chinese_list = list(chinese_list)
    chinese_string = ''.join(chinese_list)
    return chinese_string

def add_custom_chinese_unicode(s):
    '''
    由于加载所有中文Unicode 会很慢, 所以直接只加载需要的即可
    '''
    unicode_list = set()
    for c in s:
        unicode_list.add(ord(c))
    unicode_list = list(unicode_list)
    dpg.add_font_chars(unicode_list)

with dpg.font_registry():
    with dpg.font("/home/wcq/.local/share/fonts/sarasa-mono-sc-regular.ttf", 20) as default_font:
        add_custom_chinese_unicode(extract_chinese_text(__file__))
        dpg.bind_font(default_font)

dpg.create_viewport(title='Custom Title', width=800, height=600)
with dpg.window(label='测试中文 Ω', width=800, height=300):
    dpg.add_text(label='test' , default_value='测试 θ \u03a9')
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()
dpg.destroy_context()

解析

字体选择

选一款同时支持显示中文和特殊字符的字体, 这里以 等距更纱黑体 为例

添加中文支持( 官网例程, 不推荐使用, 除非电脑性能非常好 )

1
2
3
4
        dpg.add_font_range_hint(dpg.mvFontRangeHint_Default)
        dpg.add_font_range_hint(dpg.mvFontRangeHint_Chinese_Simplified_Common)
        # dpg.add_font_range_hint(dpg.mvFontRangeHint_Chinese_Full)   # 这个会影响启动速度
        dpg.bind_font(default_font)

但是这个相当影响速度, 启动后要一两秒钟才能加载完Unicode, 于是就有了下面的按需加载

按需加载Unicode ( 推荐 )

  1. 使用 extract_chinese_text 提取出文件中的所有Unicode 编码的字符串,
  2. 然后再使用 add_custom_chinese_unicode 来加载到dearpygui 中

这样速度相当快, 由于是自动扫描的, 所以也是相当通用

添加特殊字符支持

如果使用自动扫描的方式加载, 就不需要看下面的废话了🦉

  • 获取特殊字符的Unicode 编码

    • 通过Python 代码获得

      例如通过以下代码可以获得 Ω 的Unicode 编码为0x03a9

      1
      
      print(f"Ω Unicode : 0x{ord('Ω'):04x}")
      
  • 支持希腊字母的 Code

    1
    
    dpg.add_font_range(0x1, 0x400)
    

    通过Wiki 可以知道希腊字母的Unicode 编码范围是 0x0370 ~ 0x03ff, 这里直接把1 到 0x400 都包含了也是没有问题的
    🐜 注意: 这里不可以包含0, 否则显示不了, 而且不会报错, 可能是0 是NULL 的原因?