【问题标题】:python pyautogui working together with pynputpython pyautogui 与 pynput 一起工作
【发布时间】:2019-02-02 22:07:09
【问题描述】:

接下来是主题,我正在使用 pyautogui 做一些简单的点击器,但它缺乏控制。基本上我希望能够基于 pyautogui 启动和停止不同的脚本。我的想法是结合 pynput 的 Listener 功能,但它不能正常工作。当我按下分配的键时它开始,但我无法停止它,为什么? 这是一些简单的代码:

from pynput.keyboard import Key, Controller, Listener
import time
import pyautogui as pg
pg.FAILSAFE = True
kb = Controller()
time.sleep(1)
def on_press(key):
    if key == Key.space:
        pg.position(500, 500)
        x = 20
        while key is not Key.enter:
            pg.moveRel(x, 0, duration=0.2)
            time.sleep(1)



with Listener(on_press=on_press) as listener:
    listener.join()

我也试过这个循环:

while True:
    if key==Key.enter:
        pg.moveRel(x, 0, duration=0.2)
    else:
        return(False)
    time.sleep(1)

但没有任何效果。

更新: 也许有人可以建议我另一个具有控制功能的模块,这对点击器有好处?

【问题讨论】:

    标签: python pyautogui pynput


    【解决方案1】:

    它无法停止,因为您在执行此操作时处于无限循环中:

    while key is not Key.enter:
    

    由于您的 on_press 无法再次调用,因此变量 key 永远不会改变。

    from pynput.keyboard import Key, Controller, Listener
    import time
    import pyautogui as pg
    
    
    import threading
    
    pg.FAILSAFE = True
    kb = Controller()
    time.sleep(1)
    
    threadExitFlag = threading.Event()
    threadVar = None
    
    
    def mouse_move_thread(threadExitFlag):
        pg.position(500, 500)
        x = 20
        while not threadExitFlag.is_set():
            pg.moveRel(x, 0, duration=0.2)
            time.sleep(1)
    
    def on_press(key):
        global threadExitFlag
    
        if key == Key.space:
            threadVar = threading.Thread(target=mouse_move_thread, args=[threadExitFlag]).start()
        if key == Key.enter:
            threadExitFlag.set()
    
        #Turns this macro back on
        elif key == Key.esc:
            if threadExitFlag.is_set():
                threadExitFlag.clear()
    
    
    with Listener(on_press=on_press) as listener:
        listener.join()
    

    要使用此功能,您可以按空格键开始鼠标移动,然后按 Enter 键停止。在此之后,您需要按 esc 键 来重置停止它的事件,这意味着您需要连续两次执行此宏:

    space (start the macro)
    enter (stop/kill the macro)
    esc (reset flag, if you press space after this you can start the macro again)
    

    我已经测试过了,它可以 100% 工作。

    【讨论】:

    • 你是对的。我只需要避免循环它...谢谢。
    • 在此之前我实际上从未使用过 python 线程,但我用一种适合你的方法更新了我的帖子。
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2022-12-15
    • 2011-10-13
    相关资源
    最近更新 更多