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程序中用csv模块来操作csv文件的基本使用教程
Mar 03 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
利用python批量修改word文件名的方法示例
Oct 17 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
python中的字符串内部换行方法
Jul 19 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
Apache部署Django项目图文详解
Jul 30 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python如何实现爬取B站视频
May 20 Python
python 用opencv实现霍夫线变换
Nov 27 Python
Python基础之pandas数据合并
上手简单,功能强大的Python爬虫框架——feapder
python绘制箱型图
基于Python实现的购物商城管理系统
Apr 27 #Python
详解用Python把PDF转为Word方法总结
python实现的web监控系统
python opencv人脸识别考勤系统的完整源码
Apr 26 #Python
You might like
分页显示Oracle数据库记录的类之一
2006/10/09 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
vue按需加载实例详解
2019/09/06 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
微信跳一跳自动运行python脚本
2018/01/08 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
python批量赋值操作实例
2018/10/22 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
params有什么用
2016/03/01 面试题
毕业生的自我评价
2013/12/30 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
霸王洗发水广告词
2014/03/14 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
导游词之山东八大关
2019/12/18 职场文书
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js