🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 等待长时间操作 GUI应用程序行为通常不稳定,您的脚本需要等待,直到出现新窗口或关闭/隐藏现有窗口。 pywinauto可以隐式地(默认超时)灵活地等待对话框初始化,或者明确地使用专用方法/函数来帮助您使代码更容易和更可靠。 ## Application 方法 > * [wait_cpu_usage_lower](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.application.html?highlight=wait_cpu_usage_lower#pywinauto.application.Application.wait_cpu_usage_lower) (new in pywinauto 0.5.2, renamed in 0.6.0) 此方法对于多线程接口很有用,当GUI响应且所有控件都已存在且似乎已准备好使用时,允许在另一个线程中进行延迟初始化。因此,等待特定窗口的存在/状态是无用的。在这种情况下,整个进程的CPU使用率表示任务计算尚未完成。 范例: ~~~ app.wait_cpu_usage_lower(threshold=5) # 等到CPU使用率低于5% ~~~ >[info]注意:此方法仅适用于整个应用程序进程,不适用于窗口/元素。 ## WindowSpecification 方法 These methods are available to all controls. > * [wait](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.application.html?highlight=wait#pywinauto.application.WindowSpecification.wait) > * [wait\_not](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.application.html?highlight=wait_not#pywinauto.application.WindowSpecification.wait_not) 有一个包含长等待的例子: [install script for 7zip 9.20 x64](https://gist.github.com/vasily-v-ryabov/7a04717af4584cbb840f). `WindowSpecification`对象不一定与现有窗口/控件相关。 这只是一个描述,即搜索窗口的几个标准。 `wait`方法(如果没有引发任何异常)可以保证目标控件存在,甚至可见,启用和/或激活。 ## `timings`模块中的函数 还有一些对任何Python代码都有用的低级方法。 > * [wait\_until](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.timings.html?highlight=wait_until#pywinauto.timings.wait_until) > * [wait\_until\_passes](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.timings.html?highlight=wait_until_passes#pywinauto.timings.wait_until_passes) 如果每个函数调用都应该有时序控制,也可以使用装饰器[`pywinauto.timings.always_wait_until()`](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.timings.html#pywinauto.timings.always_wait_until "pywinauto.timings.always_wait_until")和[`pywinauto.timings.always_wait_until_passes()`](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.timings.html#pywinauto.timings.always_wait_until_passes "pywinauto.timings.always_wait_until_passes") ~~~ # call ensure_text_changed(ctrl) every 2 sec until it's passed or timeout (4 sec) is expired @always_wait_until_passes(4, 2) def ensure_text_changed(ctrl): if previous_text == ctrl.window_text(): raise ValueError('The ctrl text remains the same while change is expected') ~~~ ## Global timings for all actions 许多动作需要在之前,之后和之间暂停。 模块`timings`中有几个全局常量定义了这种暂停。 通过在对象`timings.Timings`中设置全局静态变量,它可以单独根据您的需要进行调整。 所有全局计时可以一次设置为默认值,或者加倍,或者除以2: ~~~ from timings import Timings Timings.defaults() Timings.slow() # double all timings (~2x slower script execution) Timings.fast() # divide all timings by two (~2x faster) ~~~ ## 识别控件 帮助您找到所需控件的方法。 > * [print_control_identifiers](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.application.html?highlight=print_control_identifiers#pywinauto.application.WindowSpecification.print_control_identifiers) > * [draw_outline](https://pywinauto.readthedocs.io/en/latest/code/pywinauto.controls.hwndwrapper.html?highlight=draw_outline#pywinauto.controls.hwndwrapper.HwndWrapper.draw_outline) ### 如何 * [如何](HowTo.md)