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?)
-
2it's because you use windows features to do stuff instead of cross platform lib. You are locking yourself into a trap. For picture manipulation, use PIL.Bite code– Bite code2009-08-15 09:49:58 +00:00Commented Aug 15, 2009 at 9:49
-
Alan: check this out: developer.apple.com/graphicsimaging/pythonandquartz.htmlKoen Bok– Koen Bok2009-08-15 21:36:58 +00:00Commented Aug 15, 2009 at 21:36
4 Answers
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))
1 Comment
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)
1 Comment
pip install pyobjc-framework-QuartzAs 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.
2 Comments
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
1 Comment
system_profiler SPDisplaysDataType outputs the maximum resolution of my screen, not the current resolution.