Pywinauto 计时等待 0.5 秒而不是立即计时
Pywinauto timings waiting 0.5 seconds instead of immediate
我有以下 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()
版本中修复了一个超时错误 0.6.3
也许这就是您遇到的问题
您需要预先搜索元素 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()
时,每次都会隐式调用搜索过程。 Getting Started Guide, Chapter "Window Specification".
中对此进行了描述
此外,我建议将变量命名为 tb_panel2_spec
或 tb_panel2_wrapper
而不是 app2
以避免混淆其类型。
P.S。 Python 中可靠的跨平台时间测量方法是 import timeit; timeit.default_timer()
.
PS2: from pywinauto import mouse
不是必需的,因为您正在使用方法 .click_input()
.
编辑 3:
真正的问题是 win32gui.GetDoubleClickTime()
returns 500 毫秒。方法 .click_input()
试图以这种方式消除双击。我们可以添加可选参数来禁用此等待。您可以通过猴子修补 win32gui
来解决它。在开头添加这段代码:
import win32gui
def no_double_click_time():
return 0
win32gui.GetDoubleClickTime = no_double_click_time
我有以下 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()
版本中修复了一个超时错误 0.6.3
也许这就是您遇到的问题
您需要预先搜索元素 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()
时,每次都会隐式调用搜索过程。 Getting Started Guide, Chapter "Window Specification".
此外,我建议将变量命名为 tb_panel2_spec
或 tb_panel2_wrapper
而不是 app2
以避免混淆其类型。
P.S。 Python 中可靠的跨平台时间测量方法是 import timeit; timeit.default_timer()
.
PS2: from pywinauto import mouse
不是必需的,因为您正在使用方法 .click_input()
.
编辑 3:
真正的问题是 win32gui.GetDoubleClickTime()
returns 500 毫秒。方法 .click_input()
试图以这种方式消除双击。我们可以添加可选参数来禁用此等待。您可以通过猴子修补 win32gui
来解决它。在开头添加这段代码:
import win32gui
def no_double_click_time():
return 0
win32gui.GetDoubleClickTime = no_double_click_time