【问题标题】:Pausing pywinauto loop and start over?暂停 pywinauto 循环并重新开始?
【发布时间】:2020-11-14 12:39:47
【问题描述】:

我在使用 MS Excel 等其他应用程序时尝试运行 python 脚本

我有一个脚本(宏),当我点击“Caps Lock”时它会运行,它会写入 1000 次“1234”。在按“Esc”写 1000 次“1234”后,我能够终止所有脚本

脚本:

from pynput.keyboard import Key, Listener
import pywinauto as pw

def on_press(key):
    if key==Key.caps_lock:
        for i in range(1,1000):
            pw.keyboard.send_keys("1234",pause=0.01)
            
def on_release(key):
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
with Listener(
            on_press=on_press,
            on_release=on_release) as listener:
        listener.join()

在第 xx 次写入“1234”并重新开始时,如何让它暂停(循环)?但我不想终止所有脚本。只是暂停,重新开始,暂停并重新开始......

提前谢谢你

【问题讨论】:

    标签: python listener pywinauto pynput


    【解决方案1】:

    注意:这段代码我没试过,有很大概率是不行的。 那是因为我刚刚升级了你的脚本来给你一个想法。 在 on_press() 结束之前,Listener() 可能不允许您继续收听。您应该查看 Listener() 类是否为您提供了解锁模式,在该模式下,它在线程中启动事件时继续侦听。 我有一段时间没有使用 pyinput,所以我不知道。 如果有或没有,请使用我的模型来控制您的线程,该线程将进行实际写作。您启动一个线程,该线程等待标志为真,然后写入,直到标志为假,依此类推。当您想在写作过程中或任何地方结束程序时,您可以使用另一个标志来完全中断您的写作循环。 您的线程需要有一个 while 循环(例如,在运行时:...),它将启动您的 for 循环,该循环将在内部检查暂停和运行标志。如果暂停则等待,如果 running 为 False,则中断。在您的 for 循环之前,您设置一个等待标志,例如begin 或者你总是从 paused = True 开始,你的选择。 on_press() 和 on_release() 只是将标志设置为适当的值。我建议您始终将它们设置在 on_release() 中,特别是如果您将来开始使用鼠标位置和/或鼠标按钮。但是,这是您对脚本目的和用法的偏好和要求。 哦,还有一件额外的事情。不要忘记在脚本退出时优雅地结束线程。您可以使用 atexit 模块为将运行标志设置为 False 并等待线程终止的处理程序注册一个处理程序。为了表明这一点,您可以使用额外的标志,我通常将其称为“完成”,在线程中的 while 循环结束之前,它是 False。 这是一个示例,如果 Listener() 具有解锁模式并且您设置了它,它将起作用。

    from time import sleep paused = False def wait (): while paused: try: sleep(0.001) except: # If signal interrupts the sleep() break def on_press(key): global paused if paused: paused = False return if key==Key.caps_lock: # Note: your script wrote 999 times "1024", not 1000 . # range() starts at first arg, and ends at second-1. # Your script started at 1, and ended at 999, therefore start with 0, or use range(1, 1001) # Or just use 1000, like I did, which is the same for i in range(1000): pw.keyboard.send_keys("1234",pause=0.01) wait() def on_release(key): global paused if key == Key.esc: # Stop listener return False if key==Key.<some_key>: # Switch paused from True to False and from False to True paused = not paused

    【讨论】:

    • 首先,非常感谢您的回复,但我做不到:(如果我错了,请纠正我,就在写“1234”之前,我需要一些中断来暂停循环. 方案应该是这样的; CapsLock 命中 --> 进入循环 --> 检查暂停 --> 写入 "1234" --> 进入循环 --> 检查暂停 ... --> 如果我不这样做,循环结束暂停,我做不到:) 只需要暂停一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多