将您的Python程序标记为高DPI无缝地识别Windows

时间:2017-04-13 21:05:38

标签: python graphics operating-system dpi winreg

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

0 个答案:

没有答案