问题
使用 wxPython 编写的程序在某些高 DPI 的电脑(通常是笔记本)上显示出来的字体会非常模糊:
事实上 wxPython 是支持高 DPI 的,但是由于我们的程序没有显式指明支持高 DPI,因此系统默认不支持高 DPI,就直接强行缩放画面,导致字体模糊。
系统方法
我们可以在系统的兼容性设置里强制更改某个程序的 DPI 缩放设置。
这里面有三个选项:
- 应用程序:不强制缩放,交由应用程序处理。
- 系统:默认使用的就是这种。前面说过,程序不支持高 DPI 的情况下就会强制缩放。
- 系统(增强):针对 GDI 程序特别优化的缩放,“系统”是位图缩放,相当于缩放照片;“系统(增强)”是矢量缩放,不会变模糊。
应用程序 | ![]() |
---|---|
系统 | ![]() |
系统(增强) | ![]() |
可以看到第三种效果最好。
(图片压缩,图上可能看不太出来)
程序方法
根据微软官方的文档,声明程序支持高 DPI 是通过设置清单文件来实现的。因此对于 Python 程序来说,高 DPI 设置只有打包后才会生效。
这里我用的是 Pyinstaller,根据文档,在打包命令里增加一个选项:
--manifest <清单文件路径>
或者如果你用 .spec 文件来打包的话,在 EXE 段里增加一个 manifest
:
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
# ...
)
pyz = PYZ(a.pure)
exe = EXE(
# ...
manifest='manifest.xml', # 清单文件
)
然后新建 manifest.xml
文件,粘贴以下内容进去:
<!-- 兼容性:系统 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0