多线程点击宏/点击记录器

Multi - threading click macro / click recorder

我正在编写一个脚本,该脚本将监听击键直到按下 'q' 按钮,之后它应该停止脚本并打印出以 2 秒为间隔保存的鼠标位置。我无法管理线程,我仍在学习这个主题。每次我 运行 代码没有任何反应,但过程是 运行ning:

from pynput.keyboard import Listener
import pyautogui
from multiprocessing import Process

import time

mouse_positions = []
def func1():
while True:
    time.sleep(2)
    mouse_positions.append(pyautogui.position())

cordinates = []
quit_status = False
keystrokes = []
    
def on_press(key):
    if "q" in str(key) :
        print('q was pressed!')
        exit("Stopped running")
        #qprint(key)
    keystrokes.append(key)
    print(keystrokes)
        #print(keystrokes)

if __name__ == '__main__':
    p1 = Process(target=func1)
    p1.start()
    p1.join()
    with Listener(on_press=on_press) as listener:  # Create an instance of Listener
        listener.join()  # Join the listener thread to the main thread to keep waiting for keys

编辑: 对于任何有兴趣的人,这是我构建的 click 宏,我之前构建的脚本更像是鼠标捕获移动。下面的脚本将记录您的鼠标点击,然后重播它们。好多了。

from pynput.keyboard import Listener
import pyautogui
from pynput import mouse
import time

x_pos = []
y_pos = []
both_pos = []
pressed_key  = None

def on_click(x, y, button, pressed):
    if pressed:
        #print ("{0} {1}".format(x,y))
        print(pressed_key)
        if pressed_key == "1":
            both_pos.append("{0}".format(x,y))
            both_pos.append("{1}".format(x,y))
            #print("test" + x_pos + y_pos)
            print (x_pos + y_pos)
        else:
            pass
        if pressed_key == 'q':
            return False

def on_press(key):
    print("To replay press 'q' , to stop recording press '1' , to record again press '1' .")
    global pressed_key
    if 'Key.esc' in str(key):
        return False
    if '1' in str(key):
        pressed_key= None if pressed_key == '1' else '1'
    if 'q' in str(key):
        print("Replaying actions")
        print(str(len(both_pos)))
        for point in range(0,len(both_pos),2):
            time.sleep(3)
            print("clicking")
            pyautogui.click(x=int(both_pos[point]),y=int(both_pos[point+1]))
        print("done...")
        return False
        


mouse_listener = mouse.Listener(on_click=on_click)
mouse_listener.start()
with Listener(on_press=on_press) as listener:  # Create an instance of Listener
    listener.join()
    #print(mouse_listener.mouse_positions)

您好,您可以使用 threading 模块。 我创建了继承自 threading.Thread class 的 class MouseListener。您想要 运行 放入 run 方法的所有内容。作为线程停止器,我使用了 still_run 属性。 当你打字时,我传递给 on_press 功能按键和 mouse_listener。如果按下 q 我将 mouse_listener.still_run 设置为 False,导致鼠标侦听器停止的原因。

mouse_positions 我从全局范围移动到 MouseListener


import threading

from pynput.keyboard import Listener
import pyautogui

import time


class MouseListener(threading.Thread):
    still_run = True
    mouse_positions = []
    def run(self):
        self.func()

    def func(self):
        while self.still_run:
            time.sleep(2)
            self.mouse_positions.append(pyautogui.position())
            print(self.mouse_positions)

coordinates = []
quit_status = False
keystrokes = []


def on_press(key, mouse_listener):
    print('kp')
    if "q" in str(key):
        print('q was pressed!')
        mouse_listener.still_run = False
        print(key)
        exit("Stopped running")
    keystrokes.append(key)
    print(keystrokes)
    print(keystrokes)


if __name__ == '__main__':
    mouse_listener = MouseListener()
    mouse_listener.start()
    with Listener(on_press=lambda key: on_press(key, mouse_listener)) as listener:  # Create an instance of Listener
        listener.join()
    print(mouse_listener.mouse_positions)