On Tuesday, November 26, 2013 2:13:57 PM UTC-8, jos...@gmail.com wrote:
> I am currently using Windows 7 Sp1, Tkinter 8.5, Python 2.7.4 on a laptop 
> with no attached monitor. I am attempting to use winfo_screenmmwidth, but the 
> returned value is incorrect. Specs state 280 mm. Physical measurement is 275 
> mm. EDID states 280 mm. Tkinter's winfo_screenmmwidth returns 361 mm. I don't 
> have very much tkinter experience, please bear with me.
> 
> 
> 
> From where does winfo_screenmmheight get this information? I have looked 
> through the source code and can't really find the source. The source code 
> seems to lead to WidthMMOfScreen(Screen(tkwin)) in both tkGet.c and tkObj.c. 
> Xlib.h defines the Screen structure which has mwidth defined in it. Xlib.h 
> also defines WidthMMOfScreen as a macro "#define WidthMMOfScreen(s)        
> ((s)->mwidth)" The X Window System Protocol:8 Connection Setup:Screen 
> Information states "Width-in-millimeters and height-in-millimeters can be 
> used to determine the physical size and the aspect ratio," but I'm not sure 
> where the code is for the request.
> 
> 
> 
> So that's where I stopped on the X Windows side of things. I think I need to 
> look at the source code for _tkinter.lib, but I'm not sure. I downloaded and 
> started to look at the pywin32.exe (win32all) source code, but I'm not sure 
> where to start with that either. I was expecting to see an entry which 
> returns the EDID information, but I have not seen that yet.
> 
> 
> 
> Could somebody point me in the right direction? Or does anyone have any ideas?
> 
> 
> 
> Thank you in advance.

I wrote this to extract the EDID information. It's not very robust and for some 
reason not all of the subkeys are iterated in a sub key. I also haven't gotten 
a response from the tcl/tk folks yet.

import _winreg

def screen_wh():
    """Input - none
    Output - Screen's physical (width, height)"""
    hive = _winreg.HKEY_LOCAL_MACHINE
    path = "SYSTEM\\CurrentControlSet\\Enum\\DISPLAY"
    number = 0
    rtpath = None

    def search_subkeys(hive, path, number, rtpath):
        number = number + 1
        key = _winreg.OpenKey(hive, path, 0, _winreg.KEY_READ)
        try:
            i = 0
            while 1:
                name = _winreg.EnumKey(key, i)
                #print(" "*number + name, i) #Used to view registry path
                #for some reason this does not iterate over all registry keys 
crappy fix
                if i == 2:
                    try:
                        #This works with a direct call, but it's not very 
portable.
                        name2 = _winreg.EnumKey(key, 3)
                        if name2 == "Control":
                            rtpath = path
                    except WindowsError:
                        pass
                if rtpath == None:
                    rtpath = search_subkeys(hive, path+"\\"+name, number, 
rtpath)
                i += 1
        except WindowsError:
            pass
        
        return(rtpath)

    monitor = search_subkeys(hive,path, number,rtpath)
    print("EDID registry path: {0}".format(monitor))
    key = _winreg.OpenKey(hive, monitor+"\\Device Parameters")
    try:
        i = 0
        while 1:
            name, data, type = _winreg.EnumValue(key, i)
            if name == 'EDID':
                break
    except WindowsError:
        "EDID not found"
    width  = int(data[21].encode('hex'),16) * 10
    height = int(data[22].encode('hex'),16) * 10
    print("Width: {0} mm\nHeight: {1} mm".format(width,height))
    return((width, height))
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to