想了一个偷懒的写法,做了一个模块,
取名叫tktool
不过这个函数运行后是会修改原有 tkinter 中的功能的
使用的时候就
if __name__ == "__main__":
import tktool
tktool.set_DPI_MODE(2)
win = Win()
win.mainloop()
可以配合
Tkinter布局助手
做一点简单的界面
import tkinter as tk
import ctypes
import re
ScaleFactor = ctypes.windll.shcore.GetScaleFactorForDevice(0) / 100
ZoomFactor = 1.0
DPI_MODE = 0
def TkS(value) -> int:
if DPI_MODE <= 1:
return int(ZoomFactor * value)
elif DPI_MODE == 2:
return int(ZoomFactor * ScaleFactor * int(value))
_default_place = tk.Place.place_configure
_default_geometry = tk.Wm.wm_geometry
def set_DPI_MODE(mode, zoom=1.0):
'''mode模式,zoom额外缩放'''
global DPI_MODE
global ZoomFactor
DPI_MODE = mode
ZoomFactor = zoom
if DPI_MODE == 0:
ctypes.windll.shcore.SetProcessDpiAwareness(0)
elif DPI_MODE == 1 or DPI_MODE == 2:
ctypes.windll.shcore.SetProcessDpiAwareness(1)
if DPI_MODE == 1 or DPI_MODE == 2:
# 修改 place 功能
def place(self, cnf={}, **kw):
change = ('x', 'y', 'width', 'height')
for k in change:
if k in kw:
kw[k] = TkS(kw[k])
return _default_place(self, cnf, **kw)
tk.Place.place = place
# 修改 geometry 功能
def geometry(self, newGeometry=None):
if DPI_MODE == 1:
# 窗口保持原本的像素比
self.tk.call('tk', 'scaling', ZoomFactor * 96 / 72)
elif DPI_MODE == 2:
# 使用TkS拉伸窗口,窗口的像素尺寸
self.tk.call('tk', 'scaling', ZoomFactor * ScaleFactor * 96 / 72)
if isinstance(newGeometry, str):
sText = newGeometry
objPattern = re.compile(r'''((?P<size>(?P<width>\d+)x(?P<height>\d+))?)((?P<pos>\+\d+\+\d+)?)''', re.M)
objMatcher = objPattern.search(string=sText)
if objMatcher is not None:
newg = objMatcher.groupdict()
if newg['size'] is not None and newg['size'] != '':
ret = "{}x{}{}".format(TkS(int(newg['width'])), TkS(int(newg['height'])), newg['pos'])
# 符合规则时修改创建的窗口大小
return _default_geometry(self, ret)
else:
return _default_geometry(self, newGeometry)
else:
return _default_geometry(self, newGeometry)
else:
return _default_geometry(self, newGeometry)
tk.Wm.geometry = geometry
def restore():
'''还原 place 和 geometry 的功能
'''
tk.Place.place = _default_place
tk.Wm.geometry = _default_geometry