首页 > 解决方案 > Pywinauto 计时等待 0.5 秒而不是立即

问题描述

我有以下 Pywinauto 代码,等待时间是 0.5 秒而不是立即。如何立即获得?

from pywinauto import application, timings, mouse
import time

app = application.Application()
app.connect(title = 'Mensagem')
app = app.Mensagem
app2 = app.TBPanel2
buttonCoord = int((app2.rectangle().right - app2.rectangle().left)/2/2), int((app2.rectangle().bottom - app2.rectangle().top)/2)
buttonCoord = buttonCoord[0]*(2*2-1),buttonCoord[1]
timings.Timings.after_clickinput_wait = 0.001
timings.Timings.after_setcursorpos_wait = 0.001

starttime = time.perf_counter()
#while app.Edit1.texts()[0] != '':
for i in range(10):
    buttonCoord = int((app2.rectangle().right - app2.rectangle().left)/2/2), int((app2.rectangle().bottom - app2.rectangle().top)/2)
    buttonCoord = buttonCoord[0]*(2*2-1),buttonCoord[1]
    app2.click_input(button='left', coords=(buttonCoord))
    print('Entre cliques demorou ', str(time.perf_counter()-starttime), ' segundos')
    starttime = time.perf_counter()

当我运行时,点击之间的间隔是 0.5 秒:

Entre cliques demorou  0.4614592999999999  segundos
Entre cliques demorou  0.44403170000000003  segundos
Entre cliques demorou  0.48520320000000017  segundos
Entre cliques demorou  0.4723533999999998  segundos
Entre cliques demorou  0.46825479999999997  segundos
Entre cliques demorou  0.4439942000000001  segundos
Entre cliques demorou  0.4874373999999997  segundos
Entre cliques demorou  0.47333040000000004  segundos
Entre cliques demorou  0.46036510000000064  segundos

但是,当我疯狂地移动鼠标时,它会更快:

Entre cliques demorou  0.06659199999999998  segundos
Entre cliques demorou  0.1532768000000001  segundos
Entre cliques demorou  0.05349690000000007  segundos
Entre cliques demorou  0.049827499999999914  segundos
Entre cliques demorou  0.05078930000000015  segundos
Entre cliques demorou  0.04885250000000019  segundos
Entre cliques demorou  0.06023690000000004  segundos
Entre cliques demorou  0.048675000000000024  segundos
Entre cliques demorou  0.05394080000000012  segundos
Entre cliques demorou  0.05615450000000011  segundos

我到底做错了什么?

编辑:对于更通用的方法和测试,调整代码,相同的结果

from pywinauto import application, timings
import time

app2 = application.Application()
app2.connect(title_re = '.*Notas*') #In portuguese, Notepad is translated to 'Bloco de Notas', so change to your system name
app2 = app2.window(title_re = '.*Notas*') #same here
app2 = app2.wrapper_object()
timings.Timings.after_clickinput_wait = 0.001
timings.Timings.after_setcursorpos_wait = 0.001
starttime = time.perf_counter()
for i in range(100):
    app2.click_input(button='left', coords=(100,100))
    print('Between clicks took ', str(time.perf_counter()-starttime), ' seconds')
    starttime = time.perf_counter()

标签: pythonpython-3.xautomationpywinauto

解决方案


您需要预先搜索元素app2并将其保存为包装对象:

app2 = app.TBPanel2.wrapper_object()
# or
app2 = app.TBPanel2.wait('ready', timeout=10) # if you need non-default time to wait

在您当前的代码app2 = app.TBPanel2中是一个WindowSpecification对象,它只是一个搜索条件。因此,当您调用.rectangle().click_input()每次都隐式调用搜索过程时。这在入门指南的“窗口规范”一章中进行了描述。

另外我建议命名变量tb_panel2_spec,或者tb_panel2_wrapper避免app2混淆它的类型。

PS 另外,在 Python 中测量时间的可靠跨平台方法是import timeit; timeit.default_timer().

PS2:from pywinauto import mouse没有必要,因为您使用的是 method .click_input()


编辑3:

真正的问题是win32gui.GetDoubleClickTime()返回 500 毫秒。方法.click_input()试图以这种方式消除双击。我们可以添加可选参数来禁用此等待。您可以通过猴子修补来解决它win32gui。在开头添加这段代码:

import win32gui

def no_double_click_time():
    return 0

win32gui.GetDoubleClickTime = no_double_click_time

推荐阅读