Python实战之用tkinter库做一个鼠标模拟点击器


Posted in Python onApril 27, 2021

前言

用Python做一个鼠标模拟点击器,可以实现多位置,定时,定次数,定区域随机位置点击,对于一些比较肝的游戏(痒痒鼠之类的),挂机非常有帮助,解放双手;定区域随机点击可以一定程度上防止系统检测出有使用脚本开挂的行为

import tkinter as tk
import random
import pyautogui as mouse
from tkinter.messagebox import *

安装库

首先是今天要用到的几个必要的库:tkinter,random,pyautogui

没有安装tkinter库和pyautogui库可以按照一下操作:

打开CMD控制台,依次输入:

pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ tkinter

pip install -i https://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()

效果图

Python实战之用tkinter库做一个鼠标模拟点击器
Python实战之用tkinter库做一个鼠标模拟点击器
Python实战之用tkinter库做一个鼠标模拟点击器

到此这篇关于Python实战之用tkinter库做一个鼠标模拟点击器的文章就介绍到这了,更多相关Python tkinter库鼠标模拟点击器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python的绘图工具matplotlib使用实例
Jul 03 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
python实现输入数字的连续加减方法
Jun 22 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
Django中的用户身份验证示例详解
Aug 07 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
Python基础之pandas数据合并
上手简单,功能强大的Python爬虫框架——feapder
python绘制箱型图
基于Python实现的购物商城管理系统
Apr 27 #Python
详解用Python把PDF转为Word方法总结
python实现的web监控系统
python opencv人脸识别考勤系统的完整源码
Apr 26 #Python
You might like
9个PHP开发常用功能函数小结
2011/07/15 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
javascript String 的扩展方法集合
2008/06/01 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
JavaScript调用模式与this关键字绑定的关系
2018/04/21 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
Python简单生成随机数的方法示例
2018/03/31 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Flask-Mail用法实例分析
2018/07/21 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
python用什么编辑器进行项目开发
2020/06/17 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
给全校老师的建议书
2014/03/13 职场文书
殡葬服务心得体会
2014/09/11 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
行政申诉状范文
2015/05/20 职场文书
公司保洁员管理制度
2015/08/04 职场文书
幼儿园教学反思范文
2016/03/02 职场文书
React更新渲染原理深入分析
2022/12/24 Javascript