4

我正在使用 Python 的 PyAutoGUI 库来自动化 GUI。在我完成当前窗口上的数据输入后,我正在自动化的应用程序会打开一个新窗口。一切都由 python 自动化处理(我当前窗口中的数据输入和打开窗口所需的单击)。

在当前窗口中执行单击时,新窗口需要一些时间才能打开(范围可能为 2 - 5 秒)。因此,我可以在这里想到两个选项:

  1. 睡眠使用time.sleep(5)(缺点:3 秒可能会被不必要地浪费)
  2. 在一个紧密的循环中旋转,直到窗口出现在屏幕上。PyAutoGUI 提供了一个locateOnScreen函数,可以用来判断窗口是否真的出现在屏幕上。(但是,这是 CPU 密集型的,函数本身也是 CPU 密集型的,需要将近 2 秒才能返回)

所以看起来 [1] 对我来说是一个更好的选择。是否有其他一些我可能错过的技术会比这两种方法中的任何一种更好?谢谢。

4

3 回答 3

5

仅适用于 Windows 的 GUI 自动化pywinauto 功能更全(和 Pythonic)。它隐式等待一些默认时间并允许显式等待(内部有一些 CPU 非密集型循环:0.1 秒暂停并快速检查更改,然后再次等待)。

PyAutoGUIlocateOnScreen功能使用高级分析截图。这就是为什么它如此占用 CPU(但跨平台)的原因。

pywinauto 示例:

from pywinauto import Application

app = Application(backend="win32").start(u'your_app.exe')
app.MainWindow.menu_select(u'File->Open')

app.OpenDialog.Edit.set_edit_text(u'some path')
app.OpenDialog.Open.click()
app.OpenDialog.wait_not('visible', timeout=10)

new_main_window = app.window(title_re='^.* - The Software$')
new_main_window.wait('ready', timeout=15)

入门指南是学习 pywinauto 核心概念的良好起点。

于 2015-12-19T20:18:51.177 回答
1

我认为您可以使用 pyautogui.getAllWindows。此函数返回所有窗口及其句柄。这样您就可以检查何时添加了新窗口。看到这个:

windows=pyautogui.getAllWindows()
windows_count=len(windows)
    if len(pyautogui.getAllWindows())!=windows_count:
        break

此外,您可以使用所需窗口的句柄编号来激活所需窗口并将其置于前台:

desired_window=pyautogui.Window(#enter window handle number)
desired_window.activate()

我认为更简单的另一种方法是 pyautogui.getActiveWindowTitle()。此函数返回活动窗口的标题。也许您可以将其用于中断条件。

while True:
    title=pyautogui.getActiveWindowTitle()
    if title== "your desired window's title":
        break
于 2022-03-02T21:20:17.690 回答
0

我会选择选项一,但如果这是打开窗口所需的最短平均时间,我会睡 2 秒。2 秒后,我会检查窗口是否出现,如果没有,我会再睡 2 秒。这可能会比睡 5 秒节省更多时间。

但是由于尝试检查窗口是 CPU 密集型和耗时的,我认为等待 5 秒会更好。

于 2015-12-18T18:41:55.507 回答