3

我只是想分享我发现的最好的方法,以防其他人遇到像我一样的问题。如果您的 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()
4

0 回答 0