如何使用 python 获取本机 mac 应用程序的 UI 元素?
Posted
技术标签:
【中文标题】如何使用 python 获取本机 mac 应用程序的 UI 元素?【英文标题】:How do I use python to get the UI elements of a native mac app? 【发布时间】:2020-07-08 00:53:57 【问题描述】:我需要从 mac GUI 上的 UI 元素中获取文本。
一种可能的途径可能是通过 pyobjc 和 UIAccessibility?
https://developer.apple.com/documentation/objectivec/nsobject/uiaccessibility https://pyobjc.readthedocs.io/en/latest/core/intro.html
我使用 RTFM 已经好几个小时了,还是搞不明白。我不是 pyobjc 或 mac 开发人员,这于事无补。我想这很容易,我找不到网上的例子。
也许我们可以添加一个很好的例子作为这个问题的答案:)
【问题讨论】:
当你说“来自 UI 元素的文本”时,你能说得更具体一点或者举个具体的例子吗?你是不是例如想要控制某个应用程序的按钮(比如 SystemPreferences、Mail)或获取 TextEdit 文档的内容? 【参考方案1】:您可以使用 Python Quartz 包访问有关窗口和标题的一些信息,但听起来您希望在窗口中呈现项目。如果只是窗口信息,请使用 Quartz,要点如下:
import Quartz
windows = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)
print windows[0].valueForKey_(kCGWindowBounds)
...
如果您希望在窗口中呈现项目,您需要能够修改子程序,使其设置 NSWindow.sharingType = .readOnly。此外,您很可能需要生成子进程。毕竟,您也许可以使用 CGWindowID 获得 NSWindow 的句柄:
import AppKit
windowID = windows[0].valueForKey_(kCGWindowNumber)
window = NSWindow.windowWithWindowNumber(windowID)
print window.contentView.subViews[0]
...
并自省 NSWindow.contentView 以找到 NSTextField 等类型的目标子视图。
第二部分使用NSWindow.windowWithWindowNumber我没有尝试过,但是我在其他项目中成功使用了Quartz包。
【讨论】:
【参考方案2】:根据我之前的尝试,pyatomac 被证明非常有用。他们有很好的文档。
【讨论】:
以上是关于如何使用 python 获取本机 mac 应用程序的 UI 元素?的主要内容,如果未能解决你的问题,请参考以下文章
Python - 使用 C 类型和本机 ioctl() 获取 Mac 地址会产生未知结果