Pyautogui 在 2 个显示器的特定屏幕应用程序中

问题描述 投票:0回答:3

好吧,让我们把这个疑问分成几个部分。 第一个问题,如何在 Windows 上的特定应用程序窗口中制作 pyautogui.locateOnScreen() ?例如,仅在 Windows 计算器中搜索图像?

第二个问题是我有2个显示器,如何在特定显示器上搜索图像?

我编写了一个简单的代码,但无法工作,因为我的计算器在我的第二台显示器上打开。

def main():
    try:
        while True:
           button7location = pyautogui.locateOnScreen('images/calc7Key.png', region=(0,0,1920, 1080), confidence=.5)
           print(button7location)

    except KeyboardInterrupt:
        print('\nDone.')

main()
python pyautogui
3个回答
1
投票

这个答案可能迟到了,但对于那些寻找答案的人来说,答案就在这里: https://github.com/asweigart/pyautogui/issues/321

引用 - 为我解决

如果仍然与 Windows 上的人相关:

我认为问题在于,当前版本的 pyscreeze 在 Windows 上使用 >ImageGrab (Pillow) 仅使用单屏抓取。


pyscreeze中的一个肮脏的快速修复可能是:


  • 启用全屏抓取:

文件中:

pyscreeze/__init__.py
,功能:
def _screenshot_win32(imageFilename=None, region=None):

im = ImageGrab.grab()
更改为
im = ImageGrab.grab(all_screens= True)


  • 处理由于多显示器而引入的新负坐标:

文件中:

pyscreeze/__init__.py
,功能:
def locateOnScreen(image, minSearchTime=0, **kwargs):
后面
retVal = locate(image, screenshotIm, **kwargs)
>add


if retVal and sys.platform == 'win32':
    # get the lowest x and y coordinate of the monitor setup
    monitors = win32api.EnumDisplayMonitors()
    x_min = min([mon[2][0] for mon in monitors])
    y_min = min([mon[2][1] for mon in monitors])
    # add negative offset due to multi monitor
    retVal = Box(left=retVal[0] + x_min, top=retVal[1] + y_min, width=retVal[2],height=retVal[3])

  • 别忘了添加
    import win32api

文件中:

pyscreeze/__init__.py


if sys.platform == 'win32': # TODO - Pillow now supports ImageGrab on macOS.
    import win32api # used for multi-monitor fix
    from PIL import ImageGrab

0
投票

不幸的是 pyautogui 目前不支持多显示器,你可以在他们的 FAQ

中找到它

问:PyAutoGUI 是否适用于多显示器设置。

A:不,现在 PyAutoGUI 仅处理主显示器。

在搜索特定区域时,您可以使用可选的

region=(startXValue,startYValue,width,height)
参数,如此处所示。


0
投票

这个答案有点晚了,但无论如何:D

  1. 捕获Windows上的特定窗口

    没有直接的方法可以在任何操作系统上执行此操作,因为只有 pyautogui 搜索监视器捕获的图像。这意味着没有字面意思 对计算机进程或窗口的引用。要执行此操作,请在 不太好,但工作方法是找到所需的角落 使用某种标识符的窗口。然后你可以计算 基于这些点的窗口区域。

例如,这里是在 Windows 上获取 cmd 窗口的代码:

cmd_identifier = None

cmd_identifier = pyautogui.locateOnScreen(
    os.path.join(WINDOWS_IMG_DIR, CMD_IDENTIFIER_IMG),
    confidence=0.8,
    minSearchTime=10,
)

cmd_bar_region = None

screen_size = pag.size()

cmd_bar_region = (
    cmd_identifier.left,
    cmd_identifier.top,
    screen_size.width,
    cmd_identifier.top + cmd_identifier.height,
)

cmd_options = None

# Focus cmd
pyautogui.click(
    cmd_bar_region[0] + cmd_bar_region[2] / 2,
    cmd_bar_region[1] + cmd_bar_region[3] / 2,
)

cmd_options = pyautogui.locateOnScreen(
    os.path.join(WINDOWS_IMG_DIR, "window_options.png"),
    confidence=0.8,
    region=cmd_bar_region,
    minSearchTime=10,
)

cmd_options_to_screen_bottom_region = (
    cmd_options.left,
    cmd_options.top,
    cmd_options.left + cmd_options.width,
    screen_size.height,
)

scrollbar_arrow_down = None

scrollbar_arrow_down = pyautogui.locateOnScreen(
    os.path.join(WINDOWS_IMG_DIR, "scrollbar_arrow_down.png"),
    confidence=0.8,
    region=cmd_options_to_screen_bottom_region,
    minSearchTime=10,
)

cmd_content_region = (
    cmd_identifier.left,
    cmd_identifier.top + cmd_identifier.height,
    scrollbar_arrow_down.left,
    scrollbar_arrow_down.top + scrollbar_arrow_down.height,
)
  1. 特定显示器搜索

    这个问题已经回答了这里

© www.soinside.com 2019 - 2024. All rights reserved.