如何通过Python获取Mac的桌面分辨率?

10

我想写一个Python应用程序,从RSS源下载图像,并制作复合背景。如何在Mac OS X(Leopard)上获取当前桌面分辨率?


2
这是因为你使用 Windows 功能来完成任务,而不是跨平台库。你正在将自己锁入困境。对于图片操作,请使用PIL。 - Bite code
Alan:看看这个:http://developer.apple.com/graphicsimaging/pythonandquartz.html - Koen Bok
4个回答

13

使用 Pyobjc 应该可以像这样工作。Pyobjc 随 Leopard 一起提供。

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

有了它,你还可以获取宽度和高度。

NSScreen.mainScreen().frame().size.width
NSScreen.mainScreen().frame().size.height
例如:
print("Current screen resolution: %dx%d" % (NSScreen.mainScreen().frame().size.width, NSScreen.mainScreen().frame().size.height))

是的,pyobjc相当不错。自Leopard以来,它就存在于每台Mac上。还记得当实际使用这个时,许多Mac用户都有多个屏幕。因此,在需要时要考虑到这一点。请参阅苹果关于NSScreen的文档以获取更多信息。 - Koen Bok

8

如果您正在使用LaunchAgent脚本执行此操作,则可能需要使用核心图形原语而不是AppKit级别的方法。今天我在处理此问题时,从我的LaunchAgent加载的脚本中使用NSScreen.mainScreen()返回None,但如果我从会话的终端中加载它,则可以正常工作。

from Quartz import CGDisplayBounds
from Quartz import CGMainDisplayID

def screen_size():
    mainMonitor = CGDisplayBounds(CGMainDisplayID())
    return (mainMonitor.size.width, mainMonitor.size.height) 

1
这对我有用,一旦使用pip install pyobjc-framework-Quartz安装了Quartz。 - Touten

2

我曾经在让这些工作上遇到了困难,所以我四处寻找了一些信息并整合出了一些看起来可行的方案。由于我不太熟悉编码,如果有任何错误之处,请多多包涵。如果您有任何想法,请在评论区留言。

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
这对我不起作用,system_profiler SPDisplaysDataType 输出的是我的屏幕的最大分辨率,而不是当前分辨率。 - Touten

2

通常情况下,使用绑定到操作系统的功能是一个非常糟糕的想法。在Python中有数百个可移植库可以让您访问这些信息。我首先想到的是pygame:

import pygame
from pygame.locals import *

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

但我想可可豆做得也很好,因此wxpython或qt是你的朋友。我猜在Windows上,你会这样做:
from win32api import GetSystemMetrics
width = GetSystemMetrics [0]
height = GetSystemMetrics [1]

虽然这种方式更加简单,但是在Mac、Linux、BSD、Solaris以及未来的Windows版本中可能无法使用。


pygame的示例对我没有用,因为你获取的是pygame屏幕的分辨率,而不是你的物理屏幕。我不太了解pygame,所以如果我漏掉了什么,请告诉我。 - Touten
1
你的代码把我的屏幕变成了低分辨率游戏窗口,而且没有任何退出的功能。我不得不强制重启我的Mac!你的想法是正确的——我们需要可移植的代码,但解决方案很糟糕,因为pygame.init()会打开一个我们不需要的游戏窗口。 - ishahak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接