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 mysqldb连接数据库
Mar 16 Python
Python中的tuple元组详细介绍
Feb 02 Python
Python中的MongoDB基本操作:连接、查询实例
Feb 13 Python
Android分包MultiDex策略详解
Oct 30 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Python生成rsa密钥对操作示例
Apr 26 Python
Python初学者常见错误详解
Jul 02 Python
python实现的发邮件功能示例
Sep 11 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
python实现局部图像放大
Nov 17 Python
Elasticsearch 数据类型及管理
Apr 19 Python
Python基础之pandas数据合并
上手简单,功能强大的Python爬虫框架——feapder
python绘制箱型图
基于Python实现的购物商城管理系统
Apr 27 #Python
详解用Python把PDF转为Word方法总结
python实现的web监控系统
python opencv人脸识别考勤系统的完整源码
Apr 26 #Python
You might like
用PHP和MySQL保存和输出图片
2006/10/09 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
Jquery Ajax请求代码(2)
2011/01/07 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
初识Node.js
2015/03/20 Javascript
JavaScript对Json的增删改属性详解
2016/06/02 Javascript
微信小程序 wx.request(OBJECT)发起请求详解
2016/10/13 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
Python实现堆排序的方法详解
2016/05/03 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python找出最小的K个数实例代码
2018/01/04 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python实现静态web服务器
2019/09/03 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
事业单位绩效考核实施方案
2014/03/27 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
招商银行工作证明
2015/06/17 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书