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模拟登陆Tom邮箱示例分享
Jan 13 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
python创建文件备份的脚本
Sep 11 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
python实现图片压缩代码实例
Aug 12 Python
python 3.6.7实现端口扫描器
Sep 04 Python
详解Python 中sys.stdin.readline()的用法
Sep 12 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
Python dict的常用方法示例代码
Jun 23 Python
python通过函数名调用函数的几种方法总结
Jun 07 Python
Python基础之pandas数据合并
上手简单,功能强大的Python爬虫框架——feapder
python绘制箱型图
基于Python实现的购物商城管理系统
Apr 27 #Python
详解用Python把PDF转为Word方法总结
python实现的web监控系统
python opencv人脸识别考勤系统的完整源码
Apr 26 #Python
You might like
第七章 php自定义函数实现代码
2011/12/30 PHP
10个超级有用值得收藏的PHP代码片段
2015/01/22 PHP
php实现网页端验证码功能
2017/07/11 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
Python压缩和解压缩zip文件
2015/02/14 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
python实现简易数码时钟
2021/02/19 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Python二维码生成识别实例详解
2019/07/16 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
Python装饰器结合递归原理解析
2020/07/02 Python
浅析HTML5的WebSocket与服务器推送事件
2016/02/19 HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
FILA德国官方网站:来自意大利的体育和街头服饰品牌
2019/07/19 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
2014年社区教育工作总结
2014/12/02 职场文书