How to get the desktop resolution in Mac via Python?

前端 未结 4 1418
渐次进展
渐次进展 2021-02-15 13:52

Trying to write a python application that downloads images from an RSS feed, and makes a composite background. How do I get the current desktop resolution on Mac OS X (leopard?)

相关标签:
4条回答
  • 2021-02-15 14:38

    As usual, using features that are binded to an OS is a very bad idea. There are hundred of portable libs in Python that give you access to that information. The first that comes to my mind is of course pygame :

    import pygame
    from pygame.locals import *
    
    pygame.init()
    screen = pygame.display.set_mode((640,480), FULLSCREEN)
    x, y = screen.get_size()
    

    But I guess cocoa do just as good, and therefor wxpython or qt is your friend. I suppose on Windows you did something like this :

    from win32api import GetSystemMetrics
    width = GetSystemMetrics [0]
    height = GetSystemMetrics [1]
    

    Sure it's easier, but won't work on Mac, Linux, BSD, Solaris, and probably nor very later windows version.

    0 讨论(0)
  • 2021-02-15 14:43

    I was having a hard time getting any of this to work so I looked around and put something together that seems to work. I am kinda new at coding so please excuse any errors. If you have any thoughts please comment.

    results = str(subprocess.Popen(['system_profiler SPDisplaysDataType'],stdout=subprocess.PIPE, shell=True).communicate()[0])
    res = re.search('Resolution: \d* x \d*', results).group(0).split(' ')
    width, height = res[1], res[3]
    return width, height
    
    0 讨论(0)
  • With Pyobjc something like this should work. Pyobjc comes with Leopard.

    from AppKit import NSScreen
    print(NSScreen.mainScreen().frame())
    

    With that, you can also grab the width and height.

    NSScreen.mainScreen().frame().size.width
    NSScreen.mainScreen().frame().size.height
    

    For example:

    print("Current screen resolution: %dx%d" % (NSScreen.mainScreen().frame().size.width, NSScreen.mainScreen().frame().size.height))
    
    0 讨论(0)
  • 2021-02-15 14:47

    If you are doing this from a LaunchAgent script, you may need to drop down to CoreGraphics primitives rather than AppKit-level methods. Working on this today, my LaunchAgent-loaded script gets None back from NSScreen.mainScreen(), but works fine if I load it from a terminal in my session.

    from Quartz import CGDisplayBounds
    from Quartz import CGMainDisplayID
    
    def screen_size():
        mainMonitor = CGDisplayBounds(CGMainDisplayID())
        return (mainMonitor.size.width, mainMonitor.size.height) 
    
    0 讨论(0)
提交回复
热议问题