├── .gitignore ├── README.md ├── images ├── NoneFontGlyph.gif ├── NoneFontGlyph.png ├── test1.png └── test2.png ├── test功能.py ├── test字符表.py ├── wubicodeeditor.py ├── 功用 ├── csv文件处理.py └── 功能.py ├── 字符表.py ├── 常量.py └── 测试 ├── CJK-test.txt └── CJK-修改.csv /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/python,visualstudiocode 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .nox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # celery beat schedule file 88 | celerybeat-schedule 89 | 90 | # SageMath parsed files 91 | *.sage.py 92 | 93 | # Environments 94 | .env 95 | .venv 96 | env/ 97 | venv/ 98 | ENV/ 99 | env.bak/ 100 | venv.bak/ 101 | 102 | # Spyder project settings 103 | .spyderproject 104 | .spyproject 105 | 106 | # Rope project settings 107 | .ropeproject 108 | 109 | # mkdocs documentation 110 | /site 111 | 112 | # mypy 113 | .mypy_cache/ 114 | .dmypy.json 115 | dmypy.json 116 | 117 | ### Python Patch ### 118 | .venv/ 119 | 120 | ### Python.VirtualEnv Stack ### 121 | # Virtualenv 122 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ 123 | [Bb]in 124 | [Ii]nclude 125 | [Ll]ib 126 | [Ll]ib64 127 | [Ll]ocal 128 | [Ss]cripts 129 | pyvenv.cfg 130 | pip-selfcheck.json 131 | 132 | ### VisualStudioCode ### 133 | .vscode/* 134 | !.vscode/settings.json 135 | !.vscode/tasks.json 136 | !.vscode/launch.json 137 | !.vscode/extensions.json 138 | 139 | 140 | # End of https://www.gitignore.io/api/python,visualstudiocode 141 | 142 | Unicode 143 | UnicodeCJK-WuBi 144 | UnicodeCJK-FontGlyphs 145 | 146 | # 暂时不列入版本控制 147 | CJK-所有.txt 148 | 149 | # Unicode资源: https://github.com/CNMan/Unicode.git 150 | Unicode -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [使用介绍](https://github.com/CNMan/UnicodeCJK-WuBi/issues/5). 需[五笔字型超大字符集编码数据库](https://github.com/CNMan/UnicodeCJK-WuBi)与[字体图片](https://github.com/CNMan/UnicodeCJK-FontGlyphs) 2 | 3 | [中文编程](https://zhuanlan.zhihu.com/c_140193266)知乎专栏相关文章: 4 | 5 | - [用Python3+tkinter开发简单图形界面程序](https://zhuanlan.zhihu.com/p/45597251) 6 | 7 | 运行单元测试: 8 | ``` 9 | $ python -m unittest 10 | ``` 11 | -------------------------------------------------------------------------------- /images/NoneFontGlyph.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/program-in-chinese/wubi_code_editor/071fd3921775daa51ce72be3bb6ab8a4e98a2ea8/images/NoneFontGlyph.gif -------------------------------------------------------------------------------- /images/NoneFontGlyph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/program-in-chinese/wubi_code_editor/071fd3921775daa51ce72be3bb6ab8a4e98a2ea8/images/NoneFontGlyph.png -------------------------------------------------------------------------------- /images/test1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/program-in-chinese/wubi_code_editor/071fd3921775daa51ce72be3bb6ab8a4e98a2ea8/images/test1.png -------------------------------------------------------------------------------- /images/test2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/program-in-chinese/wubi_code_editor/071fd3921775daa51ce72be3bb6ab8a4e98a2ea8/images/test2.png -------------------------------------------------------------------------------- /test功能.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from 功用.功能 import * 3 | 4 | 5 | class test功能(unittest.TestCase): 6 | 7 | def test_合法unicode(self): 8 | self.assertEqual(功能.组成图片子路径("3400"), "Plane00/U_003400") 9 | self.assertEqual(功能.组成图片子路径("13400"), "Plane01/U_013400") 10 | self.assertEqual(功能.组成图片子路径("23400"), "Plane02/U_023400") 11 | self.assertEqual(功能.组成图片子路径("33400"), "Plane03/U_033400") 12 | self.assertEqual(功能.组成图片子路径("E3400"), "Plane14/U_0E3400") 13 | self.assertEqual(功能.组成图片子路径("F3400"), "Plane15/U_0F3400") 14 | self.assertEqual(功能.组成图片子路径("103400"), "Plane16/U_103400") 15 | 16 | if __name__ == '__main__': 17 | unittest.main() 18 | -------------------------------------------------------------------------------- /test字符表.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import 字符表 3 | 4 | 字符1 = ['1111', '一', 'a', 'b', 'c', 1, 1] 5 | 字符2 = ['2222', '二', 'b', 'c', 'd', 2, 2] 6 | 7 | 8 | class test字符表(unittest.TestCase): 9 | 10 | 字符表 = 字符表.字符表() 11 | 12 | def test_0_添加字符(self): 13 | self.字符表.添加所有字符([字符1]) 14 | self.assertEqual(self.字符表.取所有字符(), [字符1]) 15 | self.字符表.添加所有字符([字符2]) 16 | self.assertEqual(self.字符表.取所有字符(), [字符1, 字符2]) 17 | 18 | def test_1_取当前字符(self): 19 | self.assertEqual(self.字符表.取当前字符(), 字符1) 20 | 21 | def test_2_取当前字符区间号(self): 22 | self.assertEqual(self.字符表.取当前字符区间号(), 0) 23 | self.assertEqual(self.字符表.取当前字符区间(), (0, 1)) 24 | 25 | def test_3_取下一个字符(self): 26 | self.字符表.取下一个字符() 27 | self.assertEqual(self.字符表.取当前字符(), 字符2) 28 | 29 | def test_4_取当前字符区间号(self): 30 | self.assertEqual(self.字符表.取当前字符区间号(), 1) 31 | self.assertEqual(self.字符表.取当前字符区间(), (1, 2)) 32 | 33 | def test_5_取下一个字符失败(self): 34 | self.字符表.取下一个字符() 35 | self.assertEqual(self.字符表.取当前字符(), 字符2) 36 | 37 | def test_6_取上一个字符(self): 38 | self.字符表.取上一个字符() 39 | self.assertEqual(self.字符表.取当前字符(), 字符1) 40 | 41 | def test_7_取上一个字符失败(self): 42 | self.字符表.取上一个字符() 43 | self.assertEqual(self.字符表.取当前字符(), 字符1) 44 | 45 | if __name__ == '__main__': 46 | unittest.main() 47 | -------------------------------------------------------------------------------- /wubicodeeditor.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import 常量 3 | import 字符表 4 | from tkinter import * 5 | from functools import partial 6 | 7 | from 功用.csv文件处理 import csv文件处理 8 | from 功用.功能 import * 9 | 10 | 11 | class Application(Frame): 12 | def __init__(self, master=None): 13 | super().__init__(master) 14 | self.pack() 15 | self.字符表 = 字符表.字符表() 16 | self.创建控件() 17 | 18 | def 修改当前条目(self): 19 | self.字符表.修改当前字符(self.编码86版值.get(), 20 | self.编码98版值.get(), self.编码06版值.get()) 21 | 源数据文件路径 = 常量.源数据路径 + 常量.源数据文件[self.字符表.取当前字符区间号()] 22 | 字符区间 = self.字符表.取当前字符区间() 23 | csv文件处理.写数组到文件(self.字符表.取所有字符()[字符区间[0]:字符区间[1]], 源数据文件路径) 24 | 25 | # TODO: 提示已到开头/末尾 26 | def 上一个字符(self): 27 | self.字符表.取上一个字符() 28 | self.刷新控件() 29 | 30 | def 下一个字符(self): 31 | self.字符表.取下一个字符() 32 | self.刷新控件() 33 | 34 | def 创建字体区(self, 区域, 地区名): 35 | 字体区 = Frame(区域) 36 | 字体区.pack() 37 | 字体区提示 = Label(字体区, text=地区名 + "字形") 38 | 字体区提示.pack() 39 | 字体显示 = Frame(字体区) 40 | 字体显示.pack() 41 | for 字体 in 常量.按地区名取字体列表[地区名]: 42 | self.按字体取图片显示[字体] = self.创建图片显示(字体显示, 字体, "left") 43 | 44 | # 显示图片, 参考: https://stackoverflow.com/questions/35024118/how-to-load-an-image-into-a-python-3-4-tkinter-window 45 | def 创建图片显示(self, 区域, 字体名, 位置): 46 | 字体区 = Frame(区域) 47 | 字体区.pack(side=位置) 48 | 字体提示 = Label(字体区, text=字体名) 49 | 字体提示.pack() 50 | 图片 = self.按字体取图片(字体名) 51 | 图片显示 = Label(字体区, image=图片) 52 | 图片显示.image = 图片 53 | 图片显示.pack() 54 | return 图片显示 55 | 56 | def 创建五笔编码编辑区(self, 区域, 年份, 值): 57 | 编码区 = Frame(区域) 58 | 编码区.pack() 59 | 编码提示 = Label(编码区, text="编码" + 年份 + "版") 60 | 编码提示.pack(side="left") 61 | # 参考 https://stackoverflow.com/questions/20125967/how-to-set-default-text-for-a-tkinter-entry-widget 62 | 编码值 = StringVar(value=值) 63 | 编码 = Entry(编码区, textvariable=编码值) 64 | 编码.pack(side="right") 65 | return 编码值 66 | 67 | def 创建只读区(self, 区域, 提示文本, 值): 68 | # 显示文本, 参考https://www.python-course.eu/tkinter_labels.php 69 | 区 = Frame(区域) 70 | 区.pack() 71 | 显示提示 = Label(区, text=提示文本) 72 | 显示提示.pack(side="left") 73 | 可变值 = StringVar(value=值) 74 | 显示 = Label(区, textvariable=可变值) 75 | 显示.pack(side="right") 76 | return 可变值 77 | 78 | def 组成图片子路径(self, Unicode码): 79 | return 功能.组成图片子路径(Unicode码) + 常量.图片扩展名 80 | 81 | def 创建控件(self): 82 | self.按字体取图片显示 = {} 83 | 84 | for 文件名 in 常量.源数据文件: 85 | self.字符表.添加所有字符(csv文件处理.读文件到数组(常量.源数据路径 + 文件名)) 86 | 87 | self.IRG表 = 功能.数组前两列转换为表(csv文件处理.读IRG文件到数组(常量.IRG数据路径)) 88 | 89 | 当前字符 = self.字符表.取当前字符() 90 | 91 | 图片区 = Frame(self) 92 | 图片区.pack(side="left") 93 | 94 | for 地区名 in 常量.按地区名取字体列表.keys(): 95 | self.创建字体区(图片区, 地区名) 96 | 97 | 细节区 = Frame(self) 98 | 细节区.pack(side="right") 99 | self.Unicode编码值 = self.创建只读区(细节区, "Unicode编码", 当前字符[0]) 100 | self.Unicode编码区 = self.创建只读区(细节区, "Unicode编码区", 常量.源数据文件[self.字符表.取当前字符区间号()][:-4]) 101 | self.中国大陆笔顺值 = self.创建只读区(细节区, "中国大陆笔顺", "共" + str(len(当前字符[5])) + "画:" + 当前字符[5]) 102 | self.中国台湾笔顺值 = self.创建只读区(细节区, "中国台湾笔顺", "共" + str(len(当前字符[6])) + "画:" + 当前字符[6]) 103 | 104 | self.IRGSource值 = self.创建只读区(细节区, "IRGSource", self.构建IRG显示(当前字符[0])) 105 | 修改区 = Frame(细节区) 106 | 修改区.pack() 107 | 可改编码区 = Frame(修改区) 108 | 可改编码区.pack(side="left") 109 | self.编码86版值 = self.创建五笔编码编辑区(可改编码区, "86", 当前字符[2]) 110 | self.编码98版值 = self.创建五笔编码编辑区(可改编码区, "98", 当前字符[3]) 111 | self.编码06版值 = self.创建五笔编码编辑区(可改编码区, "06", 当前字符[4]) 112 | 113 | 修改按钮 = Button(修改区, text="修改", command=self.修改当前条目) 114 | 修改按钮.pack(side="right") 115 | 116 | 遍历区 = Frame(细节区) 117 | 遍历区.pack() 118 | 上一个 = Button(遍历区, text="上一个", command=self.上一个字符) 119 | 上一个.pack(side="left") 120 | 121 | 下一个 = Button(遍历区, text="下一个", command=self.下一个字符) 122 | 下一个.pack(side="right") 123 | 124 | 搜索区 = Frame(细节区) 125 | 搜索区.pack() 126 | 搜索值 = StringVar(value="") 127 | 搜索输入 = Entry(搜索区, textvariable=搜索值) 128 | 搜索输入.pack(side="left") 129 | 130 | 搜索 = Button(搜索区, text="按Unicode或字搜索", 131 | command=lambda: self.按Unicode或字搜索(搜索值.get())) 132 | 搜索.pack(side="right") 133 | 134 | def 构建IRG显示(self, Unicode码): 135 | IRG显示 = "" 136 | for 某键值 in 常量.IRG键值: 137 | 状态 = "" 138 | if (Unicode码 in self.IRG表) and ((常量.IRG值前缀 + 某键值 + 常量.IRG值后缀) in self.IRG表[Unicode码]): 139 | 状态 = "√" 140 | else: 141 | 状态 = "×" 142 | IRG显示 += 某键值 + 状态 + " " 143 | return IRG显示 144 | 145 | def 按Unicode或字搜索(self, 搜索框输入): 146 | 已找到 = False 147 | 输入为字 = len(搜索框输入) == 1 148 | if (输入为字): 149 | 已找到 = self.字符表.按字置当前字符(搜索框输入) 150 | else: 151 | 已找到 = self.字符表.按Unicode码置当前字符(搜索框输入) 152 | if 已找到: 153 | self.刷新控件() 154 | else: 155 | if (输入为字): 156 | print("未找到字: " + 搜索框输入) 157 | else: 158 | print("未找到Unicode码: " + 搜索框输入) 159 | 160 | def 刷新图片显示(self, 图片显示, 字体名): 161 | 图片 = self.按字体取图片(字体名) 162 | 图片显示.configure(image=图片) 163 | 图片显示.image = 图片 164 | 165 | def 按字体取图片(self, 字体名): 166 | try: 167 | return PhotoImage(file=常量.图片主目录 + 常量.图片路径[字体名] + self.组成图片子路径(self.字符表.取当前字符()[0][2:])) 168 | except: 169 | return PhotoImage(file=常量.无字体图片) 170 | 171 | # 只读部分如果为空, 显示'无', 而不是空白 172 | def 显示只读项(self, 值): 173 | return 常量.无 if not 值 else 值 174 | 175 | def 刷新控件(self): 176 | 当前字符 = self.字符表.取当前字符() 177 | print("当前字符: " + str(当前字符)) 178 | 179 | for 字体 in 常量.图片路径.keys(): 180 | self.刷新图片显示(self.按字体取图片显示[字体], 字体) 181 | 182 | self.Unicode编码值.set(self.显示只读项(当前字符[0])) 183 | self.Unicode编码区.set(常量.源数据文件[self.字符表.取当前字符区间号()][:-4]) 184 | self.编码86版值.set(当前字符[2]) 185 | self.编码98版值.set(当前字符[3]) 186 | self.编码06版值.set(当前字符[4]) 187 | self.中国大陆笔顺值.set(self.显示只读项("共" + str(len(当前字符[5])) + "画:" + 当前字符[5])) 188 | self.中国台湾笔顺值.set(self.显示只读项("共" + str(len(当前字符[6])) + "画:" + 当前字符[6])) 189 | self.IRGSource值.set(self.构建IRG显示(当前字符[0])) 190 | 191 | root = Tk() 192 | app = Application(master=root) 193 | app.mainloop() 194 | -------------------------------------------------------------------------------- /功用/csv文件处理.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | 4 | class csv文件处理: 5 | 6 | @staticmethod 7 | def 读文件到数组(文件名): 8 | # 官方文档参考: https://docs.python.org/3/library/csv.html#module-contents 9 | with open(文件名, newline='') as 源数据文件: 10 | 源数据读取器 = csv.reader(源数据文件, delimiter=',') 11 | 所有行 = [] 12 | for 行 in 源数据读取器: 13 | 所有行.append(行) 14 | return 所有行 15 | 16 | @staticmethod 17 | def 读IRG文件到数组(文件名): 18 | with open(文件名, newline='') as 源数据文件: 19 | 源数据读取器 = csv.reader(源数据文件, delimiter='\t') 20 | 所有行 = [] 21 | 行序号 = 0 22 | for 行 in 源数据读取器: 23 | if 行序号 < 31: 24 | 行序号 += 1 25 | continue 26 | 所有行.append(行) 27 | return 所有行 28 | 29 | @staticmethod 30 | def 写数组到文件(数据, 文件名): 31 | with open(文件名, 'w', newline='') as 目标文件: 32 | 写文件 = csv.writer(目标文件, delimiter=',') 33 | for 字符 in 数据: 34 | 写文件.writerow(字符) 35 | print("修改保存到: " + 文件名) 36 | -------------------------------------------------------------------------------- /功用/功能.py: -------------------------------------------------------------------------------- 1 | class 功能: 2 | # Unicode编码->Plane号 3 | # 00xxxx Plane00 4 | # 01xxxx Plane01 5 | # 02xxxx Plane02 6 | # 03xxxx Plane03 7 | # 0Exxxx Plane14 8 | # 0Fxxxx Plane15 9 | # 10xxxx Plane16 10 | # 文件名格式统一为 U_xxxxxx.png ( xxxxxx 为 6 位 Unicode 编码,不足 6 位则前面补 0 ) 11 | # 输入值为全大写, 无前置0, 输出也为全大写 12 | @staticmethod 13 | def 组成图片子路径(Unicode码): 14 | Plane值 = "00" 15 | if (len(Unicode码) == 5): 16 | 前一位 = Unicode码[0] 17 | if 前一位 == '1' or 前一位 == '2' or 前一位 == '3': 18 | Plane值 = "0" + 前一位 19 | elif 前一位 == 'E': 20 | Plane值 = "14" 21 | elif 前一位 == 'F': 22 | Plane值 = "15" 23 | elif (len(Unicode码) == 6): 24 | if Unicode码[0:2] == '10': 25 | Plane值 = "16" 26 | 补0数 = 6 - len(Unicode码) 27 | 大写Unicode码 = "0" * 补0数 + Unicode码.upper() 28 | return "Plane" + Plane值 + "/U_" + 大写Unicode码 29 | 30 | # U+3400 kIRG_GSource GKX-0078.01 31 | # U+3400 kIRG_JSource JA-2121 32 | # U+3400 kIRG_TSource T6-222C 33 | # U+3400 kRSUnicode 1.4 34 | # 转换为 35 | # "U+3400"->["kIRG_GSource", "kIRG_JSource", "kIRG_TSource", "kRSUnicode"] 36 | @staticmethod 37 | def 数组前两列转换为表(数组): 38 | 表 = {} 39 | for 行 in 数组: 40 | if len(行) == 0: 41 | break 42 | if 行[0] not in 表: 43 | 表[行[0]] = [行[1]] 44 | else: 45 | 表[行[0]].append(行[1]) 46 | return 表 47 | -------------------------------------------------------------------------------- /字符表.py: -------------------------------------------------------------------------------- 1 | class 字符表: 2 | 3 | def __init__(self): 4 | self.当前字符序号 = 0 5 | self.字符列表 = [] 6 | self.字符序号区间 = [] 7 | 8 | def 添加所有字符(self, 子字符列表): 9 | self.字符列表.extend(子字符列表) 10 | self.字符序号区间.append(len(self.字符列表)) 11 | print(self.字符序号区间) 12 | 13 | def 取当前字符区间号(self): 14 | 区间号 = 0 15 | for 末字符序号 in self.字符序号区间: 16 | if self.当前字符序号 < 末字符序号: 17 | break 18 | else: 19 | 区间号 += 1 20 | return 区间号 21 | 22 | def 取当前字符区间(self): 23 | 区间号 = self.取当前字符区间号() 24 | 结束序号 = self.字符序号区间[区间号] 25 | return (0, 结束序号) if 区间号 == 0 else (self.字符序号区间[区间号 - 1], 结束序号) 26 | 27 | def 取当前字符(self): 28 | # TODO: 判断序号范围 29 | return self.字符列表[self.当前字符序号] 30 | 31 | def 取上一个字符(self): 32 | if (self.当前字符序号 > 0): 33 | self.当前字符序号 -= 1 34 | print("字符序号: " + str(self.当前字符序号)) 35 | 36 | def 取下一个字符(self): 37 | if (self.当前字符序号 < len(self.字符列表) - 1): 38 | self.当前字符序号 += 1 39 | print("字符序号: " + str(self.当前字符序号)) 40 | 41 | def 置当前字符序号(self, 新序号): 42 | self.当前字符序号 = 新序号 43 | 44 | def 修改当前字符(self, 编码86版值, 编码98版值, 编码06版值): 45 | 当前字符 = self.取当前字符() 46 | 当前字符[2] = 编码86版值 47 | 当前字符[3] = 编码98版值 48 | 当前字符[4] = 编码06版值 49 | print("已修改: " + str(当前字符)) 50 | 51 | def 取所有字符(self): 52 | return self.字符列表 53 | 54 | # 如找到, 返回True; 否则返回False 55 | # 测试用: 3400 - A第一个, 20000 -B第一个 56 | # Unicode编码不论是否输入U+前辍均可查询:如3400和U+3400 57 | # 支持大小写 58 | # TODO: 避免线性查找 59 | def 按Unicode码置当前字符(self, unicode码): 60 | Unicode值输入 = unicode码.upper() 61 | 字符序号 = -1 62 | for 字符 in self.字符列表: 63 | 字符序号 += 1 64 | if (Unicode值输入 == 字符[0]) or ('U+' + Unicode值输入 == 字符[0]): 65 | self.置当前字符序号(字符序号) 66 | return True 67 | return False 68 | 69 | # 按字搜索 70 | def 按字置当前字符(self, 字): 71 | 字符序号 = -1 72 | for 字符 in self.字符列表: 73 | 字符序号 += 1 74 | if (字 == 字符[1]): 75 | self.置当前字符序号(字符序号) 76 | return True 77 | return False 78 | -------------------------------------------------------------------------------- /常量.py: -------------------------------------------------------------------------------- 1 | import tkinter 2 | from collections import OrderedDict 3 | 4 | 源数据路径 = "UnicodeCJK-WuBi/" 5 | 6 | # https://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt 7 | # 3000..303F; CJK Symbols and Punctuation 8 | # 3200..32FF; Enclosed CJK Letters and Months 9 | # 3300..33FF; CJK Compatibility 10 | # FE30..FE4F; CJK Compatibility Forms 11 | # 按码大小范围排序 12 | 源数据文件 = [ 13 | # 2E80..2EFF; CJK Radicals Supplement 14 | "CJKRadicalsSupplement.txt", 15 | # 2F00..2FDF; Kangxi Radicals 16 | "KangxiRadicals.txt", 17 | # 31C0..31EF; CJK Strokes 18 | "CJKStrokes.txt", 19 | # 3400..4DBF; CJK Unified Ideographs Extension A 20 | "CJK-A.txt", 21 | # 4E00..9FFF; CJK Unified Ideographs 22 | "CJK.txt", 23 | # F900..FAFF; CJK Compatibility Ideographs 24 | "CJKCompatibilityIdeographs.txt", 25 | # 20000..2A6DF; CJK Unified Ideographs Extension B 26 | "CJK-B.txt", 27 | # 2A700..2B73F; CJK Unified Ideographs Extension C 28 | "CJK-C.txt", 29 | # 2B740..2B81F; CJK Unified Ideographs Extension D 30 | "CJK-D.txt", 31 | # 2B820..2CEAF; CJK Unified Ideographs Extension E 32 | "CJK-E.txt", 33 | # 2CEB0..2EBEF; CJK Unified Ideographs Extension F 34 | "CJK-F.txt", 35 | # 2F800..2FA1F; CJK Compatibility Ideographs Supplement 36 | "CJKCompatibilityIdeographsSupplement.txt", 37 | # 30000..3134F; CJK Unified Ideographs Extension G 38 | "CJK-G.txt", 39 | # 31350..323AF; CJK Unified Ideographs Extension H 40 | "CJK-H.txt" 41 | ] 42 | # 暂时只指出导出到一个文件 43 | 修改后文件 = "CJK-所有.txt" 44 | 45 | # TODO: 支持windows路径 46 | 图片主目录 = "UnicodeCJK-FontGlyphs/" 47 | 字体名_中易宋体 = "中易宋体" 48 | 字体名_中华书局宋体 = "中华书局宋体" 49 | 字体名_汉仪字典宋 = "汉仪字典宋" 50 | 字体名_汉仪仿宋 = "汉仪仿宋" 51 | 字体名_方正宋体S = "方正宋体S" 52 | 字体名_方正楷体S = "方正楷体S" 53 | 字体名_方正新楷体S = "方正新楷体S" 54 | 字体名_BabelStoneHan = "BabelStoneHan" 55 | 字体名_NotoSansMonoCJKSC = "NotoSansMonoCJKSC" 56 | 字体名_天珩全字库 = "天珩全字库" 57 | 58 | 字体名_細明體 = "細明體" 59 | 字体名_細明體_HKSCS = "細明體_HKSCS" 60 | 字体名_方正楷体T = "方正楷体T" 61 | 字体名_全字庫正宋體 = "全字庫正宋體" 62 | 字体名_全字庫正楷體 = "全字庫正楷體" 63 | 64 | 字体名_花園明朝 = "花園明朝" 65 | 66 | 图片路径 = { 67 | 字体名_中易宋体: "SimSun/", 68 | 字体名_中华书局宋体: "ZhongHuaSong/", 69 | 字体名_汉仪字典宋: "HYZiDianSong/", 70 | 字体名_汉仪仿宋: "HYFangSong/", 71 | 字体名_方正宋体S: "FZSongS/", 72 | 字体名_方正楷体S: "FZKaiS/", 73 | 字体名_方正新楷体S: "FZNewKaiS/", 74 | 字体名_BabelStoneHan: "BabelStoneHan/", 75 | 字体名_NotoSansMonoCJKSC: "NotoSansMonoCJKSC/", 76 | 字体名_天珩全字库: "TH/", 77 | 字体名_細明體: "MingLiU/", 78 | 字体名_細明體_HKSCS: "MingLiU_HKSCS/", 79 | 字体名_方正楷体T: "FZKaiT/", 80 | 字体名_全字庫正宋體: "TW-Sung/", 81 | 字体名_全字庫正楷體: "TW-Kai/", 82 | 字体名_花園明朝: "HanaMin/" 83 | } 84 | 85 | 无字体图片 = "images/NoneFontGlyph.gif" 86 | 87 | 按地区名取字体列表 = OrderedDict([ 88 | ("中国大陆", [字体名_中易宋体, 字体名_中华书局宋体, 字体名_汉仪字典宋, 字体名_汉仪仿宋, 字体名_方正宋体S, 字体名_方正楷体S, 字体名_方正新楷体S, 字体名_BabelStoneHan, 字体名_NotoSansMonoCJKSC, 字体名_天珩全字库]), 89 | ("中国台港澳", [字体名_細明體, 字体名_細明體_HKSCS, 字体名_方正楷体T, 字体名_全字庫正宋體, 字体名_全字庫正楷體]), 90 | ("日本", [字体名_花園明朝])]) 91 | 92 | # https://stackoverflow.com/questions/27599311/tkinter-photoimage-doesnt-not-support-png-image/34995365#34995365 93 | 图片扩展名 = ".gif" if tkinter.TkVersion < 8.6 else ".png" 94 | 95 | 无 = "无" 96 | 97 | IRG数据路径 = "Unicode/Unihan/Unihan_IRGSources.txt" 98 | IRG键值 = [ 99 | # https://www.unicode.org/reports/tr38/ 100 | # kIRG_GSource (China and Singapore) 101 | "G", 102 | # kIRG_HSource (Hong Kong SAR) 103 | "H", 104 | # kIRG_JSource (Japan) 105 | "J", 106 | # kIRG_KPSource (North Korea) 107 | "KP", 108 | # kIRG_KSource (South Korea) 109 | "K", 110 | # kIRG_MSource (Macao SAR) 111 | "M", 112 | # kIRG_SSource (SAT Daizōkyō Text Database Committee) 113 | "S", 114 | # kIRG_TSource (TCA) 115 | "T", 116 | # kIRG_UKSource (UK) 117 | "UK", 118 | # kIRG_USource (UTC) 119 | "U", 120 | # kIRG_VSource (Vietnam) 121 | "V" 122 | ] 123 | IRG值前缀 = "kIRG_" 124 | IRG值后缀 = "Source" 125 | -------------------------------------------------------------------------------- /测试/CJK-test.txt: -------------------------------------------------------------------------------- 1 | 3400 㐀 gjgg hghg 2 | 3401 㐁 gkwi glwi -------------------------------------------------------------------------------- /测试/CJK-修改.csv: -------------------------------------------------------------------------------- 1 | 3400 㐀 gjg hghg 2 | 3401 㐁 gkwi glwi 3 | --------------------------------------------------------------------------------