当前位置: 首页 > news >正文

PyInstaller将.py文件转为exe,执行文件在不同的电脑出现字体大小不一致问题原因分析及解决办法

PyInstaller将.py文件转为exe后,将执行文件分发给不同的用户电脑使用时,经常出现运行文件字体大小发生变化的问题。本文重点分享产生这个问题的原因及解决的办法。

目录

一、原因分析

二、解决方案


一、原因分析

PyInstaller 打包后的可执行文件在不同电脑上出现字体大小不一致的问题,主要原因包括:

  1. 系统DPI设置差异:不同电脑的显示缩放比例设置不同(如100%、125%、150%等)

  2. 默认字体可用性:不同操作系统或系统版本默认字体不同

  3. Qt/Tkinter框架特性:GUI框架在不同环境下的自适应渲染差异

  4. 高分辨率屏幕适配:不同像素密度的显示器显示效果不同

  5. 字体回退机制:当指定字体不存在时,系统自动选择替代字体

二、解决方案

1. 显式设置字体和DPI感知

import tkinter as tk
from tkinter import font
import ctypes# 启用DPI感知(Windows系统)
try:ctypes.windll.shcore.SetProcessDpiAwareness(1)
except:passroot = tk.Tk()
# 设置默认字体
default_font = font.namedFonts("TkDefaultFont")
default_font.configure(size=12)
root.option_add("*Font", default_font)

2. 使用相对尺寸而非绝对像素

# 使用相对大小而非固定像素值
def scale_size(size):# 获取屏幕DPI缩放比例dpi = root.winfo_fpixels('1i')scale_factor = dpi / 72  # 72是标准DPIreturn int(size * scale_factor)label = tk.Label(root, text="示例文本", font=("Arial", scale_size(12)))

3. 字体回退机制

def get_safe_font(font_preferences, size):"""尝试使用首选字体,失败时使用系统安全字体"""available_fonts = list(font.families())for font_name in font_preferences:if font_name in available_fonts:return (font_name, size)# 使用系统默认字体return ("TkDefaultFont", size)font_spec = get_safe_font(["Microsoft YaHei", "Arial", "Helvetica"], 12)
label = tk.Label(root, text="示例文本", font=font_spec)

4.对于PyQt/PySide应用

import sys
from PyQt5.QtWidgets import QApplication, QLabel
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont# 启用高DPI缩放
QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True)
QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True)app = QApplication(sys.argv)# 设置字体
font = QFont("Microsoft YaHei")
font.setPointSize(10)
app.setFont(font)label = QLabel("示例文本")
label.setFont(font)

通过上述方法和建议,可以显著提高PyInstaller打包的应用在不同设备上的字体显示一致性,提升用户体验。

http://www.dtcms.com/a/347712.html

相关文章:

  • Spring:IOC(控制反转 )、DI(依赖注入 )、AOP(通知类型、事务、拦截器)
  • 主流.NET 平台的NuGet 生态正在积极拥抱 AOT
  • 【84页PPT】智慧方案某著名企业某集团协同OA整体解决方案(附下载方式)
  • MySQL索引原理与优化全解析
  • 【每天一个知识点】训推一体机
  • 13.Shell脚本修炼手册---玩转 CASE 语句(应用场景与实践技巧)
  • GitHub Actions workflow最佳实践
  • 提问:温度不改变 logits 与概率的排名,为何还会影响模型输出?
  • Linux 进程间通信之System V 共享内存
  • 深入探讨集成学习:Bagging与Boosting的核心原理与实践
  • RAG系统开发中的12大痛点及应对策略
  • SVG.js 一个轻量且强大的图形库
  • Sql server的行转列
  • word——表格跨页显示表头
  • PCL点云库入门(第24讲)——PCL库点云特征之NARF特征描述 Normal Aligned Radial Feature(NARF)
  • VGG改进(4):融合Linear Attention的高效CNN设计与实践
  • 遥感机器学习入门实战教程|Sklearn案例⑧:评估指标(metrics)全解析
  • 机器学习案例——预测矿物类型(数据处理部分)
  • 如何在wsl2+Ubuntu中安装Eclipse
  • 第七章 利用Direct3D绘制几何体
  • 一个简洁的 C++ 日志模块实现
  • AI + 医疗:智能诊断如何突破技术瓶颈,走进基层医院?
  • Azure Kubernetes Service (AKS)
  • 在Linux环境中为Jupyter Lab安装Node.js环境
  • `sudo apt update` 总是失败
  • 【KO】前端面试六
  • X射线胸部肺炎检测:基于深度学习的医学影像分析项目
  • Trae Solo模式生成一个旅行足迹App
  • JS事件的概念
  • 【最后203篇系列】035 数据表同步简单方案