Python 实现鼠标连点器

作为老Minecraft玩家,钓鱼挂机是必不可少的技能,这需要使用鼠标连点器,然而,市面上鼠标连点器功能过于复杂,且大多含有广告,所以本次项目利用Python写一个简易鼠标连点器。

使用本代码需要以下库:

time
threading
pynput
tkinter
注意:本代码只能在Windows环境运行。

代码分析
代码主要由四部分构成:

键盘监听;
鼠标控制;
多线程封装;
图形化界面;
键盘监听
# 开启主监听线程
listener = Listener(on_press=key_press)
listener.start()

def key_press(key):
# 按F8控制
if key == Key.f8:
if running:
running = False
# 停止连点也需要调用这个函数
mouse_click()
else:
running = True
mouse_click()
# 按ESC退出
elif key == Key.esc:
# 退出主监听线程
listener.stop()
利用listener线程进行监听,回调函数返回按下的键盘值key,监听函数负责调用mouse_click()函数,即鼠标操作。

running这个值可认为是全局变量,用于监听线程和鼠标操作线程的信息交互

在写代码过程中,需要注意start()和stop()需要配合使用。

鼠标操作
def mouse_click(button, time):
# 这里还需要额外线程进行监听,为了能够更新self.running,防止陷入死循环
key_listener = Listener(on_press=self.key_press)
key_listener.start()
while running:
# 点按
mouse.click(button)
# 间隔
time.sleep(time)
# 关闭线程,避免资源消耗
key_listener.stop()
在mouse_click()中,也需要开启线程来监听键盘操作,这是为了能够实时更新running值,以便能正常退出循环。

多线程封装
首先将上述代码封装为一个名为MouseClick的类,内部使用多线程是为了防止GUI卡死:

class MouseClick:
def __init__(self, button, time):
self.mouse = pynput.mouse.Controller()
self.running = False # 确认是否在运行
self.time = time
self.button = button
# 开启主监听线程
self.listener = Listener(on_press=self.key_press)
self.listener.start()

def key_press(self, key):
if key == Key.f8:
if self.running:
self.running = False
# 停止连点也需要调用这个函数
self.mouse_click()
else:
self.running = True
self.mouse_click()
elif key == Key.esc:
# 退出主监听线程
self.listener.stop()

def mouse_click(self):
# 这里还需要额外线程进行监听,为了能够更新self.running,防止陷入死循环
key_listener = Listener(on_press=self.key_press)
key_listener.start()
while self.running:
self.mouse.click(self.button)
time.sleep(self.time)
key_listener.stop()
然后,为了图形化使用需要,再封装一层:

# 新线程处理函数
def new_thread_start(button, time):
# 例化类
MouseClick(button, time)

# START按键处理函数
def start():
try:
# 将文本框读到的字符串转化为浮点数
time = float(input.get())
if mouse.get() == LEFT:
button = pynput.mouse.Button.left
elif mouse.get() == RIGHT:
button = pynput.mouse.Button.right
# 开启新线程,避免GUI卡死
t = threading.Thread(target=new_thread_start, args=(button, time))
# 开启守护线程,这样在GUI意外关闭时线程能正常退出
t.setDaemon(True)
t.start()
# 不能使用 t.join(),否则也会卡死
except:
print(“ERROR!”)
注意守护进程的使用。

图形化界面
为了更方便使用,可以简单实现一下GUI界面:

root = Tk()
root.title(‘Mouse Clicker’)
root.geometry(‘400×290′)

mouse = IntVar()
lab1 = Label(root, text=’Mouse Button’, font=(“微软雅黑”, 11), fg=”gray”)
lab1.place(relx=0.05, y=10, relwidth=0.4, height=30)
r1 = Radiobutton(root, text=’LEFT’, font=(“微软雅黑”, 10), value=0, variable=mouse)
r1.place(relx=0.05, y=40, relwidth=0.15, height=30)
r2 = Radiobutton(root, text=’RIGHT’, font=(“微软雅黑”, 10), value=1, variable=mouse)
r2.place(relx=0.2, y=40, relwidth=0.3, height=30)

lab2 = Label(root, text=’Time Interval’, font=(“微软雅黑”, 11), fg=”gray”)
lab2.place(relx=0.55, y=10, relwidth=0.4, height=30)
input = Entry(root, font=(“微软雅黑”, 10))
input.place(relx=0.55, y=40, relwidth=0.4, height=30)

label3 = Label(root, text=’———- Current State and Instruction ———-‘, font=(“微软雅黑”, 8), fg=”gray”)
label3.place(relx=0.05, y=90, relwidth=0.9, height=20)
state = Text(root, font=(“微软雅黑”, 10))
state.place(relx=0.05, y=110, relwidth=0.9, height=120)

btn_start = Button(root, text=’START’, font=(“微软雅黑”, 12), fg=”white”, bg=”gray”, command=start)
btn_start.place(relx=0.3, y=240, relwidth=0.4, height=30)

root.mainloop()
打包及最终效果
在Windows环境下,还可以将其打包为.exe文件,这样即使电脑不含Python也能运行,方法如下:

安装pyinstaller:

pip install pyinstaller
由于版本兼容问题,需要将pynput降级至1.6.8:

pip install pynput==1.6.8
然后在源码所在目录执行:

pyinstaller -F -w MouseClick.py
即可生成.exe文件,位于/dist目录下

文章分类 动态 标签:
在线时间9:00~22:00