pyinstaller打包kivy的一个案列支持中文
pyinstaller打包kivy的一个案列支持中文
脚本
kivy默认不支持中文,网上有几个办法,我用了使用代码注册的方式。
找到系统的MSYH.TTC
文件并放在脚本的当前目录
import os
import sys
from kivy.core.text import LabelBase
def register_font():
# 获取字体路径
if getattr(sys, "frozen", False):
# 打包后的路径
base_path = sys._MEIPASS
font_path = os.path.join(base_path, "data", "fonts", "MSYH.TTC")
else:
# 开发时的路径
font_path = os.path.join("MSYH.TTC")
# 双重验证路径
print(font_path)
print(os.listdir())
if not os.path.exists(font_path):
raise FileNotFoundError(f"字体文件不存在于: {font_path}")
# 注册字体
try:
LabelBase.register(name="Roboto", fn_regular=font_path)
return True
except:
return False
# 在应用初始化时调用
register_font()
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.config import Config
# 必须在 App 创建前设置!
Config.set("kivy", "window_icon", "search.png") # 或 .ico
kv = """
#:import SlideTransition kivy.uix.screenmanager.SlideTransition
#:import FadeTransition kivy.uix.screenmanager.FadeTransition
#:import SwapTransition kivy.uix.screenmanager.SwapTransition
#:import WipeTransition kivy.uix.screenmanager.WipeTransition
#:import CardTransition kivy.uix.screenmanager.CardTransition
<Button>:
background_normal: '1.png' # 默认状态背景
background_down: 'bg.jpg' # 按下状态背景
background_color: (1, 1, 0, 1) # 背景颜色(RGBA,覆盖图片)
color: (1, 0, 0, 1) # 文字颜色
border: (10, 10, 10, 10) # 边框圆角(左上、右上、右下、左下)
ScreenManager:
transition: CardTransition()
MenuScreen:
name: 'menu'
SettingsScreen:
name: 'settings'
<MenuScreen@Screen>:
BoxLayout:
Button:
text: 'Goto settings李习'
on_press:
print(root.manager.transition)
# root.manager.transition.direction = 'down'
root.manager.current = 'settings'
Button:
text: 'Quit'
<SettingsScreen@Screen>:
BoxLayout:
Button:
text: 'My settings button'
Button:
text: 'Back to menu'
on_press:
print(root.manager.transition)
# root.manager.transition.direction = 'up'
root.manager.current = 'menu'
print(root.manager.screens)
"""
class TestApp(App):
def build(self):
self.title = "我的应用" # 修改窗口标题
return Builder.load_string(kv)
if __name__ == "__main__":
TestApp().run()
打包文件
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['1.py'],
pathex=[],
binaries=[],
datas=[
('MSYH.TTC', 'data/fonts'), ## 字体文件
('search.png', 'search.png'), ## 图标
('1.png', '1.png'), ## 按钮的背景,注意这里加进来没啥用,python这个垃圾。只有把这个文件放到打包后的exe同级目录才可以
('bg.jpg', 'bg.jpg') ## 同上
],
hiddenimports=[
'kivy',
'kivy.core.text.text_sdl2',
'pillow'
],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='1',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=['search.png'],
)