ventana una texto para pantallas imprimir hacer etiquetas ejemplos crear con como color botones python-3.x tkinter windows-10

python 3.x - una - Intentando resolver el texto borroso de tkinter+escala en pantallas de alta resoluciĆ³n de Windows 10, pero me preocupa que mi enfoque no sea Pythonic o no sea seguro



texto tkinter (1)

Simplemente usando windll.shcore.SetProcessDpiAwareness(1) y permitiendo el ajuste del tamaño de fuente resolvió mis problemas en Windows 10.

No estoy seguro de por qué nadie comentó o ayudó. Las fuentes borrosas son un dolor, esperaría que este hilo tuviera un debate y una mejor solución para esta molestia de Tkinter.

Después de horas de ajustes, me he decidido por este código que me permite resolver el problema familiar del texto borroso / borroso en Windows 10 en pantallas de alta resolución cuando se utilizan las interfaces Tkinter en Python 3.

No quería tener que establecer la bandera de compatibilidad o esperar que otros lo hicieran y descubrí que al marcar el reconocimiento de DPI ''activado'' a través de una llamada a DLL y luego recuperar la configuración de DPI pude escalar la ventana de la GUI y los marcos dentro de .

Sin embargo, antes de pasar esto a otros, quería comprobar si mi enfoque de pasar ''GUI'' (una instancia de tkinter.Tk ()) a la función MakeTkDPIAware en el cuerpo principal y conseguir que esa función agregue propiedades personalizadas es un método saludable. elección o arriesga causar problemas a la instancia de tkinter. Las propiedades añadidas están entonces disponibles para su uso en el cuerpo principal, pero ¿es seguro asumir que siempre sucederá?

Pude averiguar si esta práctica es conocida, y si está mal visto o una mala elección de diseño. (Muy a menudo, en Python, puedo estar tan emocionado de tener algo funcionando que me olvidé de verificar este tipo de preguntas en ese momento), así que espero que alguien pueda aconsejarme. Parecía la forma más ordenada de "recordar" los datos de escala, en lugar de crear una nueva variable global.

Me interesaría saber si otra solución sería más pitonica.

import re def Get_HWND_DPI(window_handle): #To detect high DPI displays and avoid need to set Windows compatibility flags import os if os.name == "nt": from ctypes import windll, pointer, wintypes try: windll.shcore.SetProcessDpiAwareness(1) except Exception: pass # this will fail on Windows Server and maybe early Windows DPI100pc = 96 # DPI 96 is 100% scaling DPI_type = 0 # MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2 winH = wintypes.HWND(window_handle) monitorhandle = windll.user32.MonitorFromWindow(winH, wintypes.DWORD(2)) # MONITOR_DEFAULTTONEAREST = 2 X = wintypes.UINT() Y = wintypes.UINT() try: windll.shcore.GetDpiForMonitor(monitorhandle, DPI_type, pointer(X), pointer(Y)) return X.value, Y.value, (X.value + Y.value) / (2 * DPI100pc) except Exception: return 96, 96, 1 # Assume standard Windows DPI & scaling else: return None, None, 1 # What to do for other OSs? def TkGeometryScale(s, cvtfunc): patt = r"(?P<W>/d+)x(?P<H>/d+)/+(?P<X>/d+)/+(?P<Y>/d+)" # format "WxH+X+Y" R = re.compile(patt).search(s) G = str(cvtfunc(R.group("W"))) + "x" G += str(cvtfunc(R.group("H"))) + "+" G += str(cvtfunc(R.group("X"))) + "+" G += str(cvtfunc(R.group("Y"))) return G def MakeTkDPIAware(TKGUI): TKGUI.DPI_X, TKGUI.DPI_Y, TKGUI.DPI_scaling = Get_HWND_DPI(TKGUI.winfo_id()) TKGUI.TkScale = lambda v: int(float(v) * TKGUI.DPI_scaling) TKGUI.TkGeometryScale = lambda s: TkGeometryScale(s, TKGUI.TkScale) #Example use: import tkinter GUI = tkinter.Tk() MakeTkDPIAware(GUI) # Sets the windows flag + gets adds .DPI_scaling property GUI.geometry(GUI.TkGeometryScale("600x200+200+100")) gray = "#cccccc" DemoFrame = tkinter.Frame(GUI, width=GUI.TkScale(580), height=GUI.TkScale(180), background=gray) DemoFrame.place(x=GUI.TkScale(10), y=GUI.TkScale(10)) DemoFrame.pack_propagate(False) LabelText = "Scale = " + str(GUI.DPI_scaling) DemoLabel = tkinter.Label(DemoFrame, text=LabelText, width=10, height=1) DemoLabel.pack(pady=GUI.TkScale(70))