Python tkinter库鼠标模拟点击器 Python实战之用tkinter库做一个鼠标模拟点击器
searching learner 人气:0前言
用Python做一个鼠标模拟点击器,可以实现多位置,定时,定次数,定区域随机位置点击,对于一些比较肝的游戏(痒痒鼠之类的),挂机非常有帮助,解放双手;定区域随机点击可以一定程度上防止系统检测出有使用脚本开挂的行为
import tkinter as tk import random import pyautogui as mouse from tkinter.messagebox import *
安装库
首先是今天要用到的几个必要的库:tkinter,random,pyautogui
没有安装tkinter库和pyautogui库可以按照一下操作:
打开CMD控制台,依次输入:
pip install -i http://pypi.mirrors.ustc.edu.cn/simple/ tkinter
pip install -i http://pypi.mirrors.ustc.edu.cn/simple/ pyautogui
在线安装,由于是使用的镜像源,应该下载比较快
interval_time=2 #点击时间间隔 (定时点击) number_of_clicks=1#单次点击次数(多次点击同一位置) target_quantity=1 #点击位置坐标数(点击不同的位置) windows=tk.Tk() #定义一个窗体,初始化 var=tk.StringVar("")#定义一个标签文字,用于后面通过调用 #刷新标签内容var.set(str)刷新标签内容
完整代码
注意这两行代码顺序:
windows=tk.Tk() #定义一个窗体,初始化
var=tk.StringVar("")#定义一个可变标签文字,用于后面通过调用
#var.set(str)刷新标签内容(str为一个字符串)
若在窗体初始化之前定义var,后面在调用var.set(str)时,程序会报错,无法通过编译,错误的大致含义就是var未初始化
width=400 #定义窗体的宽和 height=400 #高,400*400个像素点(注:这里还未设置窗体#宽高) windows.title("自动点击器") #窗体名称 x=windows.winfo_screenwidth() #x和y用于获取显示器的宽和高, y=windows.winfo_screenheight()#主要用途是:通过计算把上面声明 #的windows窗体放到屏幕中间
windows.winfo_screenwidth()和windows.winfo_screenheight()函数返回显示器宽和高(int 型)
windows.geometry("%dx%d+%d+%d" % (width, height, (x-width)/2,(y-height)/2)) #设置窗体宽高和位置
windows.geometry()函数一共四个参数,从左到右依次含义为:窗体宽,窗体高,窗体位置坐标x,窗体位置坐标y
windows.maxsize(width,height) #约束窗体最大尺寸和最小尺寸相同, windows.minsize(width,height) #达到目的窗体大小不可变
windows.maxsize(width,height) 和 windows.minsize(width,height) 依次含义为:约束窗体的最大尺寸和最小尺寸
mouse_position=[[0,0]]#定义并初始化一个链表,用于存储固定下来的鼠标的位置 mouse_position.clear()#将链表清空(清空初始化时的元素[0,0]) total_number_of_times=100#定义最大点击次数 start_set=False#定义一个标志,用于判断是否已经开始自动点击 click_range=1#定义点击范围(以当前鼠标坐标为中心,展开的边长为2倍click_range的平面正方形区域)单位为像素点
#函数information()返回一个字符串,包含当前设置状态的信息 def information(): k="%s%d%s%d%s%d%s%d%s%d%s"%("目标数:",target_quantity,"个 单次点击数:",number_of_clicks,"次\n点击时间间隔:",interval_time,"s 次数总上限度:",total_number_of_times,"次\n点击范围:",click_range,"像素点") return k
注:形如("%s%d%s"%(str1,int1,str2))的变量实际上的目的是将字符串str1,str2和整型变量int1合并成一个字符串,后面还会有大量这样的使用
var.set(information())#刷新标签内容var
#用于设定一个点击位置的鼠标坐标 def set_one_mouse_position(event): global mouse_position#引用全局变量mouse_position #做出判断,是否设置的鼠标坐标已经达到了设定的最大值,若未达到最大值,添#加鼠标坐标到mouse_position链表 if start_set==True and len(mouse_position)<target_quantity: x=mouse.position().x#获取当前鼠标位置的x坐标 y=mouse.position().y#获取当前鼠标位置的y坐标 ##对于设定的鼠标位置做出判断,是否可能在叠加点击范围的属性上会超出屏幕范围,并在设置后给出提醒或者警告 if x-click_range<0 or y-click_range<0: #鼠标位置可能超出屏幕范围,给出警告 showwarning(title='警告', message="%s%d%s%d%s"%('当前位置(',x,',',y,')\n可能会出现:自动点击时鼠标不在桌面')) mouse_position.append([x,y]) showinfo(title='提示', message=("%s%d%s"%("位置",len(mouse_position),'设置成功'))) var.set(information())#刷新当前设置内容信息
注:
①showinfo(title=‘提示', message=("%s%d%s"%(“置”,len(mouse_position),‘设置成功')))
以对话框的形式弹出,给用户提示,title(字符串)是对话框名字,message(字符串)是对话框文字内容
② showwarning(title=‘警告', message="%s%d%s%d%s"%(‘当前位置(',x,',',y,')\n可能会出现:自动点击时鼠标不在桌面'))
以对话框的形式弹出,给用户警告
③关键字global,将已经声明的变量前加上global再次声明的作用是:在当前函数内部对其值做出修改,并且函数返沪或结束时,其被改变的值不会恢复,(类似与C++的引用),
后面还有诸多函数内部用到global关键字
④mouse.position()返回的是一个二元组,即当前鼠标的坐标(x,y)
#功能函数,用于设置单次点击的次数 def set_number_of_clicks(num): global number_of_clicks number_of_clicks=num var.set(information())
#功能函数,用于设置点击的时间间隔 def set_interval_time(time): global interval_time interval_time=time var.set(information())
#功能函数,用于设置点击位置的数量 def set_target_quantity(num): global target_quantity target_quantity=num var.set(information())
#功能函数,开始自动点击 def start_setting_coordinates(): global start_set,mouse_position,windows #当start_set==False并且mouse_position链表当中的元素个数还未达到最大值时,继续固定鼠标坐标 if start_set==False and len(mouse_position)<target_quantity: start_set=True showinfo(title='提示', message="%s%d%s"%('开始设置鼠标坐标\n一共需要设置',target_quantity,"个位置")) #当start_set==True并且mouse_position链表当中的元素个数达到最大值时,开始自动点击 elif start_set==True and len(mouse_position)>=target_quantity: showinfo(title='提示', message='鼠标位置设置完毕,开始自动点击') nim=0 while nim<total_number_of_times: for i in range(len(mouse_position)): #以鼠标准确位置为中心的正方形内随机选取点击位置坐标 mX=random.randint(mouse_position[i][0]-click_range,mouse_position[i][0]+click_range) mY=random.randint(mouse_position[i][1]-click_range,mouse_position[i][1]+click_range) #模拟点击鼠标 mouse.click(mX,mY,button='left',clicks=number_of_clicks,interval=interval_time) #模拟移动鼠标 mouse.moveTo(mX,mY) nim=nim+1 showinfo(title='提示', message="%s%d%s"%('点击次数达到上限',total_number_of_times,'点击结束')) #点击次数达到最大次数,点击结束,清空鼠标位置链表内容,改变标志变量和当前设置信息 mouse_position.clear() start_set=False var.set(information())
注:
mouse.click(mX,mY,button=‘left',clicks=number_of_clicks,interval=interval_time)
模拟鼠标在坐标(mX,mY)出点击,button指示点击左键还是右键,clicks指示点击次数,interval指示点击的时间间隔
mouse.moveTo(mX,mY)
移动鼠标到指定位置坐标(mX,mY)
#功能函数,设置点击范围 def start_setting_click_range(rangs): global click_range ti=rangs.get()#获取rangs为本框的内容(字符串) #对于输入的内容进行差错处理 #当字符串为空时,设置点击范围click_range为0 if len(ti)==0: click_range=0 showwarning(title='警告', message='输入内容为空,当前范围为默认值:0') return #当字符串不为空时,检查每一个字符是否为数字的ascall码 for j in range(len(ti)): if ti[j]>'9' or ti[j]<'0': showerror(title='错误', message="%s%s%s"%('输入内容:\n',ti,'\n当中含有非法字符')) return #将通过上方检验的只含数字ascall码的字符串转化为整数,若整数大于0,则更新点击范围为该值 ti=int(ti) if ti>0: click_range=ti showinfo(title='提示', message="%s%d"%('设置成功,点击范围为:',click_range)) var.set(information())
注:对于文本框内容的获取,需要绑定按钮,通过在按钮点击功能函数当中获取,直接获取无法取得
#功能函数,设置点击总次数 def start_setting_click_times(times): global total_number_of_times ti=times.get() if len(ti)==0: total_number_of_times=100 showwarning(title='警告', message='输入内容为空,当前点击总次数为默认值:100') return for j in range(len(ti)): if ti[j]>'9' or ti[j]<'0': showerror(title='错误', message="%s%s%s"%('输入内容:\n',ti,'\n当中含有非法字符')) return ti=int(ti) if ti>0: total_number_of_times=ti showinfo(title='提示', message="%s%d"%('设置成功,点击总次数为:',total_number_of_times)) var.set(information())
start_setting_click_times(times)对于输入文本框的内容查错处理和上一个函数相同,不再做介绍
### 主函数 #### def main(): #初始化设置总菜单条,将菜单放在windows窗体上 menu_slect_num=tk.Menu(windows) #声明第一个下拉单选菜单,将其放在总菜单条上 file_menu1=tk.Menu(menu_slect_num,tearoff=0) #设置第一个下拉菜单的菜单封面(封面标签) menu_slect_num.add_cascade(label='目标数',menu=file_menu1) #添加可选菜单项 file_menu1.add_radiobutton(label='1',command=lambda :set_target_quantity(1))#设置菜单项的标签,绑定功能 file_menu1.add_separator()#添加菜单项之间的分割线 ##后面继续添加菜单项,绑定功能 file_menu1.add_radiobutton(label='2',command=lambda :set_target_quantity(2)) file_menu1.add_separator() file_menu1.add_radiobutton(label='3',command=lambda :set_target_quantity(3)) file_menu1.add_separator() file_menu1.add_radiobutton(label='4',command=lambda :set_target_quantity(4)) file_menu1.add_separator() file_menu1.add_radiobutton(label='5',command=lambda :set_target_quantity(5))
注:
file_menu1.add_radiobutton(label=‘1',command=lambda :set_target_quantity(1))#设置菜单项的标签,绑定功能
command指的是功能函数,只能将无参函数直接用函数名赋值给command, 对于有参函数,需要以:command=lambda :有参函数(形参1,形参2…) 的形式赋值给command,不然无法正常触发功能函数
#创建第二个下拉单选菜单,与第一个操作一样 file_menu2=tk.Menu(menu_slect_num,tearoff=0) menu_slect_num.add_cascade(label='时间间隔',menu=file_menu2) file_menu2.add_radiobutton(label='0.01s',command=lambda :set_interval_time(0.01)) file_menu2.add_separator() file_menu2.add_radiobutton(label='0.05s',command=lambda :set_interval_time(0.05)) file_menu2.add_separator() file_menu2.add_radiobutton(label='0.1s',command=lambda :set_interval_time(0.1)) file_menu2.add_separator() file_menu2.add_radiobutton(label='0.5s',command=lambda :set_interval_time(0.5)) file_menu2.add_separator() file_menu2.add_radiobutton(label='1s',command=lambda :set_interval_time(1)) file_menu2.add_separator() file_menu2.add_radiobutton(label='2s',command=lambda :set_interval_time(2)) file_menu2.add_separator() file_menu2.add_radiobutton(label='5s',command=lambda :set_interval_time(5)) file_menu2.add_separator() file_menu2.add_radiobutton(label='10s',command=lambda :set_interval_time(10))
#创建第三个下拉单选菜单,绑定功能,和上面的操作一样 file_menu3=tk.Menu(menu_slect_num,tearoff=0) menu_slect_num.add_cascade(label='单次点击数',menu=file_menu3) file_menu3.add_radiobutton(label='1次',command=lambda :set_number_of_clicks(1)) file_menu3.add_separator() file_menu3.add_radiobutton(label='2次',command=lambda :set_number_of_clicks(2)) file_menu3.add_separator() file_menu3.add_radiobutton(label='3次',command=lambda :set_number_of_clicks(3)) file_menu3.add_separator() file_menu3.add_radiobutton(label='4次',command=lambda :set_number_of_clicks(4)) file_menu3.add_separator() file_menu3.add_radiobutton(label='5次',command=lambda :set_number_of_clicks(5))
windows.config(menu=menu_slect_num)#将菜单添加到窗体上 #添加标签和按钮 #定义标签对象,设置目标窗体,标签文本(text),背景颜色(bg),前景颜色(fg),字体(font),以及宽(width),高(height) lb1=tk.Label(windows,text="按Shift-A固定鼠标或者退出自动点击",bg='black', fg='white', font=('Arial',12), width=40, height=2) lb2=tk.Label(windows,text="设置点击范围(像素点,默认为0):\n(以设置的鼠标坐标为中心展开)",bg='black', fg='white', font=('Arial', 12), width=40, height=2) lb3=tk.Label(windows,text="总点击次数(默认为100):",bg='black', fg='white', font=('Arial', 12), width=40, height=2) lb4=tk.Label(windows,textvariable=var,bg='green', fg='black', font=('Arial',12), width=40, height=3)
#定义按钮对象,设置按钮名称,绑定功能函数 b1=tk.Button(windows,text="first_click",command=start_setting_coordinates) rang=tk.Entry(windows,show=None,font=('Arial', 14)) b2=tk.Button(windows,text="second_click",command=lambda :start_setting_click_range(rang)) b3=tk.Button(windows,text="third_click",command=lambda :start_setting_click_times(timi)) #定义文本框,指定目标窗体,设置输入的文本为可见(show=None),设置文本字体font timi=tk.Entry(windows,show=None,font=('Arial', 14)) #放置按钮和标签 lb4.pack() lb1.pack() b1.pack() lb2.pack() rang.pack() b2.pack() lb3.pack() timi.pack() b3.pack()
#为窗体绑定键盘监听器,当按下组合键(Shift-A),触发功能函数set_one_mouse_position windows.bind("<Shift-A>",set_one_mouse_position) windows.mainloop()#使窗体内容不断刷新
main()
效果图
加载全部内容