Tkinter窗口美化&使用高dpi缩放适配高分屏

1.让Tkinter小部件具有Windows本地风格

from tkinter import *
from tkinter.ttk import *

ttk中的小部件会覆盖tkinter的小部件
效果对比


2.解决高分屏下程序界面模糊问题(高DPI适配)

import ctypes
#告诉操作系统使用程序自身的dpi适配
ctypes.windll.shcore.SetProcessDpiAwareness(1)
#获取屏幕的缩放因子
ScaleFactor=ctypes.windll.shcore.GetScaleFactorForDevice(0)
#设置程序缩放
root.tk.call('tk', 'scaling', ScaleFactor/75)

效果对比



明显看到字体不再模糊,小部件变的棱角分明

3.方法总结

在程序 开头 使用如下代码,即可达到期望的效果

#导入库
import ctypes
from tkinter import *
from tkinter.ttk import *
#创建窗口,root可替换成自己定义的窗口
root=Tk()
#调用api设置成由应用程序缩放
ctypes.windll.shcore.SetProcessDpiAwareness(1)
#调用api获得当前的缩放因子
ScaleFactor=ctypes.windll.shcore.GetScaleFactorForDevice(0)
#设置缩放因子
root.tk.call('tk', 'scaling', ScaleFactor/75)

附上演示程序的全部代码

import ctypes
from tkinter import *
from tkinter.ttk import *
def fac(x):
    if x==0 or x==1:
        return 1
    elif x>1:
        return x*fac(x-1)
root=Tk()
ctypes.windll.shcore.SetProcessDpiAwareness(1)
ScaleFactor=ctypes.windll.shcore.GetScaleFactorForDevice(0)
root.tk.call('tk', 'scaling', ScaleFactor/75)
root.title('计算阶乘')
frame1=Frame(root)
frame1.pack(side='top',anchor='center',expand='yes')
lable1=Label(frame1,text='input')
lable2=Label(frame1,text='output')
entry1=Entry(frame1)
entry2=Entry(frame1)
def button1_clicked():
    entry2.delete(0,END)
    entry2.insert(0,str(fac(eval(entry1.get()))))
button1=Button(frame1,text='Run',command=button1_clicked)
button2=Button(frame1,text='Quit',command=root.quit)
lable1.grid(row=0,column=0,pady=3,padx=3)