python 3.x - विंडोज 10 उच्च डीपीआई डिस्प्ले पर धुंधला टंकिनर पाठ+स्केलिंग को हल करने का प्रयास करता है, लेकिन मेरा दृष्टिकोण संबंधित है पायथनिक या असुरक्षित नहीं है



python-3.x tkinter (1)

बस windll.shcore.SetProcessDpiAwareness(1) का उपयोग कर और फ़ॉन्ट आकार समायोजन की अनुमति देकर विंडोज 10 पर मेरी समस्या हल हो गई।

यकीन है कि क्यों कोई भी टिप्पणी या सहायक हालांकि नहीं। धुंधली फोंट एक दर्द है, मुझे उम्मीद है कि यह धागा एक बहस और इस Tkinter उपद्रव के लिए एक सबसे अच्छा समाधान था।

Tweaking के घंटे के बाद मैंने इस कोड पर बसा है जो मुझे उच्चतम डीपीआई डिस्प्ले पर ब्लूटू / फजी पाठ की परिचित समस्या को पाने के लिए अनुमति देता है जब पायथन 3 में टिनकिनर इंटरफेसेस का उपयोग करते समय

मैं संगतता ध्वज सेट करना चाहता हूं या दूसरों को ऐसा करने की उम्मीद नहीं करनी चाहिए और मुझे पता चला कि डीपीआई जागरूकता को 'डीएलएल' कॉल के जरिए फ़्लैग करके और फिर डीपीआई सेटिंग पुनः प्राप्त कर रहा हूं तब मैं जीयूआई विंडो और फ़्रेम को बढ़ा सकता हूं। ।

अन्य लोगों को पास करने से पहले, हालांकि, मैं यह देखना चाहता हूं कि मुख्य व्यक्ति में 'जीयूआई' (एक टंकिनर। टीके (उदाहरण)) मेकटेकडीपीआईआईएफ़वेयर फ़ंक्शन को पास करने का मेरा दृष्टिकोण है और इसे कस्टम गुणों को जोड़ने के लिए उस समारोह को स्वस्थ बनाना है पसंद या जोखिम के कारण तस्करी के उदाहरण में समस्याएं पैदा होती हैं जोड़े गए गुण मुख्य शरीर में उपयोग के लिए उपलब्ध हैं, लेकिन यह मानना ​​सुरक्षित है कि हमेशा होता रहेगा?

मैं यह पता लगाने में सक्षम हूं कि यह अभ्यास एक ज्ञात है या नहीं - और अगर इसे डिज़ाइन किया गया है या खराब डिज़ाइन पसंद है (तो अक्सर अजगर में, मैं कुछ काम करने के लिए इतना उत्साहित हो सकता हूं कि मैं उस समय इस प्रकार के प्रश्न की जांच करना भूल जाता हूं), इसलिए मुझे आशा है कि कोई सलाह दे सकता है। यह एक नया वैश्विक चर बनाने के बजाय स्केलिंग डेटा को 'याद रखने' का सबसे पसंदीदा तरीका था।

मुझे बहुत सुनने में दिलचस्पी होगी कि एक और समाधान अधिक पायथनिक होगा

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))




windows-10