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 (1)
Oct 31 Python
python实现带验证码网站的自动登陆实现代码
Jan 12 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
python发送邮件脚本
May 22 Python
利用python如何处理nc数据详解
May 23 Python
Python Cookie 读取和保存方法
Dec 28 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
tensorflow 分类损失函数使用小记
Feb 18 Python
Python如何使用turtle库绘制图形
Feb 26 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
快速一键生成Python爬虫请求头
Mar 04 Python
Python基础之pandas数据合并
上手简单,功能强大的Python爬虫框架——feapder
python绘制箱型图
基于Python实现的购物商城管理系统
Apr 27 #Python
详解用Python把PDF转为Word方法总结
python实现的web监控系统
python opencv人脸识别考勤系统的完整源码
Apr 26 #Python
You might like
递归列出所有文件和目录
2006/10/09 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
超清晰的document对象详解
2007/02/27 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
儿童编程python入门
2018/05/08 Python
python实现俄罗斯方块游戏
2020/03/25 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
TensorFlow设置日志级别的几种方式小结
2020/02/04 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
python实现飞机大战项目
2020/03/11 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
印度最大的旅游网站:MakeMyTrip
2016/10/05 全球购物
Opodo意大利:欧洲市场上领先的在线旅行社
2019/10/24 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
韩国商务邀请函
2014/01/14 职场文书
优秀部门获奖感言
2014/02/14 职场文书
不遵守课堂纪律的检讨书
2014/09/24 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
文艺晚会开场白
2015/05/29 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
使用javascript解析二维码的三种方式
2021/11/11 Javascript
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL