我只想分享我发现这样做的最好方法,以防其他人像我一样遇到问题。如果你的Python / Kivy程序有虚拟DPI扩展的图形问题,请尝试使用此代码。它会将程序标记为您或最终用户的高DPI感知,而无需执行任何操作。这适用于Windows 10,不确定是8还是7.想知道是否有其他人知道这是否适用于8和7.要测试它,请添加代码,设置DPI,注销并重新登录用户,以便注册表标记DPI更改,并从SHELL运行您的代码。你的程序现在应该是DPI意识到的!
import winreg
from os import path as ospath
from os import execl as osexecl
from sys import executable as sysex
from sys import argv as sysargv
if __name__ == '__main__':
reg = winreg.ConnectRegistry(None,winreg.HKEY_CURRENT_USER)
key = winreg.OpenKey(reg, r"Control Panel\Desktop\WindowMetrics")
print(winreg.QueryValueEx(key, 'AppliedDPI'))
filefound=True
if winreg.QueryValueEx(key, 'AppliedDPI')[0]!=96:
key.Close()
key = winreg.OpenKey(reg, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", 0, winreg.KEY_ALL_ACCESS)
##If testing from SHELL also add these values into registry. This is not needed for complied EXEs. Make sure the path is correct or it won't work.
winreg.SetValueEx(key, 'C:\python35\pythonw.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE')
winreg.SetValueEx(key, 'C:\python35\python.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE')
##If Testing from SHELL change YOUREXE.exe to YOURPYFILE.py, otherwise it should be the name of your compiled EXE.
exepath=str(ospath.abspath('YourEXE.exe'))
try:
winreg.QueryValueEx(key, exepath)
except:
print('FileNotFound')
winreg.SetValueEx(key, exepath, 0, winreg.REG_SZ, 'HIGHDPIAWARE')
print(winreg.QueryValueEx(key, exepath))
filefound=False
print(filefound)
key.Close()
reg.Close()
##If DPI Scaling was detected and program marked in registry, restart program. This will work in SHELL and your compiled EXE, not IDLE.
if filefound==False:
print('Restarting')
python = sysex
osexecl(python, python, * sysargv)
else:
YourApp().run()