Windows 使用 Python 的桌面 GUI 自动化 - 睡眠与紧循环
Windows Desktop GUI Automation using Python - Sleep vs tight loop
我正在使用 Python 的 PyAutoGUI 库来自动化 GUI。我正在自动化的应用程序在我完成当前 window 的数据输入后打开一个新的 window。一切都由 python 自动化处理(我当前 window 中的数据输入和打开 window 所需的点击)。
在当前 window 中执行点击时,新的 window 需要一些时间才能打开(可能在 2 - 5 秒之间)。所以我在这里可以想到两个选项:
- 使用
time.sleep(5)
睡眠(缺点:可能会不必要地浪费 3 秒)
- 紧紧地旋转直到 window 出现在屏幕上。 PyAutoGUI 提供了一个
locateOnScreen
函数,可用于查明 window 是否实际出现在屏幕上。 (但是,这是 CPU 密集的,函数本身是 CPU 密集的,需要将近 2 秒才能 return)
看来 [1] 对我来说是更好的选择。有没有其他我可能错过的技术比这两种方法中的任何一种都更好?谢谢
我会选择选项一,但如果那是打开 a window 所需的最短平均时间,我会睡 2 秒。 2 秒后,我会检查 window 是否出现,如果没有,我会再次休眠 2 秒。这可能比睡 5 秒节省更多时间。
但是由于尝试检查 window 是 CPU 密集且耗时的,我认为等待 5 秒总的来说会更好。
对于 Windows 只有 GUI 自动化 pywinauto 功能更全面(和 pythonic)。它隐式等待一些默认时间并允许显式等待(内部有一些 CPU-非密集循环:类似 0.1 秒的暂停并快速检查更改,然后再次等待)。
PyAutoGUI locateOnScreen
功能使用高级截图分析。这就是为什么它如此 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)
Getting Started Guide是学习pywinauto核心概念的一个很好的起点。
我想你可以使用 pyautogui.getAllWindows()
。此函数 returns 所有 windows 及其句柄。这样您就可以检查何时添加了新的 window。看到这个:
windows=pyautogui.getAllWindows()
windows_count=len(windows)
while True:
new_windows_count=pyautogui.getAllWindows()
if len(new_windows_count)!=windows_count:
break
此外,您可以使用所需window的句柄号来激活所需的window并将其置于前台:
desired_window=pyautogui.Window(#enter window handle number)
desired_window.activate()
另一种我认为更简单的方式是pyautogui.getActiveWindowTitle()
。此功能returns 活动标题window。也许您可以将其用于中断条件。
while True:
title=pyautogui.getActiveWindowTitle()
if title== "your desired window's title":
break
我正在使用 Python 的 PyAutoGUI 库来自动化 GUI。我正在自动化的应用程序在我完成当前 window 的数据输入后打开一个新的 window。一切都由 python 自动化处理(我当前 window 中的数据输入和打开 window 所需的点击)。
在当前 window 中执行点击时,新的 window 需要一些时间才能打开(可能在 2 - 5 秒之间)。所以我在这里可以想到两个选项:
- 使用
time.sleep(5)
睡眠(缺点:可能会不必要地浪费 3 秒) - 紧紧地旋转直到 window 出现在屏幕上。 PyAutoGUI 提供了一个
locateOnScreen
函数,可用于查明 window 是否实际出现在屏幕上。 (但是,这是 CPU 密集的,函数本身是 CPU 密集的,需要将近 2 秒才能 return)
看来 [1] 对我来说是更好的选择。有没有其他我可能错过的技术比这两种方法中的任何一种都更好?谢谢
我会选择选项一,但如果那是打开 a window 所需的最短平均时间,我会睡 2 秒。 2 秒后,我会检查 window 是否出现,如果没有,我会再次休眠 2 秒。这可能比睡 5 秒节省更多时间。
但是由于尝试检查 window 是 CPU 密集且耗时的,我认为等待 5 秒总的来说会更好。
对于 Windows 只有 GUI 自动化 pywinauto 功能更全面(和 pythonic)。它隐式等待一些默认时间并允许显式等待(内部有一些 CPU-非密集循环:类似 0.1 秒的暂停并快速检查更改,然后再次等待)。
PyAutoGUI locateOnScreen
功能使用高级截图分析。这就是为什么它如此 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)
Getting Started Guide是学习pywinauto核心概念的一个很好的起点。
我想你可以使用 pyautogui.getAllWindows()
。此函数 returns 所有 windows 及其句柄。这样您就可以检查何时添加了新的 window。看到这个:
windows=pyautogui.getAllWindows()
windows_count=len(windows)
while True:
new_windows_count=pyautogui.getAllWindows()
if len(new_windows_count)!=windows_count:
break
此外,您可以使用所需window的句柄号来激活所需的window并将其置于前台:
desired_window=pyautogui.Window(#enter window handle number)
desired_window.activate()
另一种我认为更简单的方式是pyautogui.getActiveWindowTitle()
。此功能returns 活动标题window。也许您可以将其用于中断条件。
while True:
title=pyautogui.getActiveWindowTitle()
if title== "your desired window's title":
break