Python實(shí)戰(zhàn)之用tkinter庫(kù)做一個(gè)鼠標(biāo)模擬點(diǎn)擊器
前言
用Python做一個(gè)鼠標(biāo)模擬點(diǎn)擊器,可以實(shí)現(xiàn)多位置,定時(shí),定次數(shù),定區(qū)域隨機(jī)位置點(diǎn)擊,對(duì)于一些比較肝的游戲(癢癢鼠之類的),掛機(jī)非常有幫助,解放雙手;定區(qū)域隨機(jī)點(diǎn)擊可以一定程度上防止系統(tǒng)檢測(cè)出有使用腳本開(kāi)掛的行為
import tkinter as tk import random import pyautogui as mouse from tkinter.messagebox import *
安裝庫(kù)
首先是今天要用到的幾個(gè)必要的庫(kù):tkinter,random,pyautogui
沒(méi)有安裝tkinter庫(kù)和pyautogui庫(kù)可以按照一下操作:
打開(kāi)CMD控制臺(tái),依次輸入:
pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ tkinter
pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ pyautogui
在線安裝,由于是使用的鏡像源,應(yīng)該下載比較快
interval_time=2 #點(diǎn)擊時(shí)間間隔 (定時(shí)點(diǎn)擊) number_of_clicks=1#單次點(diǎn)擊次數(shù)(多次點(diǎn)擊同一位置) target_quantity=1 #點(diǎn)擊位置坐標(biāo)數(shù)(點(diǎn)擊不同的位置) windows=tk.Tk() #定義一個(gè)窗體,初始化 var=tk.StringVar("")#定義一個(gè)標(biāo)簽文字,用于后面通過(guò)調(diào)用 #刷新標(biāo)簽內(nèi)容var.set(str)刷新標(biāo)簽內(nèi)容
完整代碼
注意這兩行代碼順序:
windows=tk.Tk() #定義一個(gè)窗體,初始化
var=tk.StringVar("")#定義一個(gè)可變標(biāo)簽文字,用于后面通過(guò)調(diào)用
#var.set(str)刷新標(biāo)簽內(nèi)容(str為一個(gè)字符串)
若在窗體初始化之前定義var,后面在調(diào)用var.set(str)時(shí),程序會(huì)報(bào)錯(cuò),無(wú)法通過(guò)編譯,錯(cuò)誤的大致含義就是var未初始化
width=400 #定義窗體的寬和 height=400 #高,400*400個(gè)像素點(diǎn)(注:這里還未設(shè)置窗體#寬高) windows.title("自動(dòng)點(diǎn)擊器") #窗體名稱 x=windows.winfo_screenwidth() #x和y用于獲取顯示器的寬和高, y=windows.winfo_screenheight()#主要用途是:通過(guò)計(jì)算把上面聲明 #的windows窗體放到屏幕中間
windows.winfo_screenwidth()和windows.winfo_screenheight()函數(shù)返回顯示器寬和高(int 型)
windows.geometry("%dx%d+%d+%d" % (width, height, (x-width)/2,(y-height)/2)) #設(shè)置窗體寬高和位置
windows.geometry()函數(shù)一共四個(gè)參數(shù),從左到右依次含義為:窗體寬,窗體高,窗體位置坐標(biāo)x,窗體位置坐標(biāo)y
windows.maxsize(width,height) #約束窗體最大尺寸和最小尺寸相同, windows.minsize(width,height) #達(dá)到目的窗體大小不可變
windows.maxsize(width,height) 和 windows.minsize(width,height) 依次含義為:約束窗體的最大尺寸和最小尺寸
mouse_position=[[0,0]]#定義并初始化一個(gè)鏈表,用于存儲(chǔ)固定下來(lái)的鼠標(biāo)的位置 mouse_position.clear()#將鏈表清空(清空初始化時(shí)的元素[0,0]) total_number_of_times=100#定義最大點(diǎn)擊次數(shù) start_set=False#定義一個(gè)標(biāo)志,用于判斷是否已經(jīng)開(kāi)始自動(dòng)點(diǎn)擊 click_range=1#定義點(diǎn)擊范圍(以當(dāng)前鼠標(biāo)坐標(biāo)為中心,展開(kāi)的邊長(zhǎng)為2倍click_range的平面正方形區(qū)域)單位為像素點(diǎn)
#函數(shù)information()返回一個(gè)字符串,包含當(dāng)前設(shè)置狀態(tài)的信息 def information(): k="%s%d%s%d%s%d%s%d%s%d%s"%("目標(biāo)數(shù):",target_quantity,"個(gè) 單次點(diǎn)擊數(shù):",number_of_clicks,"次\n點(diǎn)擊時(shí)間間隔:",interval_time,"s 次數(shù)總上限度:",total_number_of_times,"次\n點(diǎn)擊范圍:",click_range,"像素點(diǎn)") return k
注:形如("%s%d%s"%(str1,int1,str2))的變量實(shí)際上的目的是將字符串str1,str2和整型變量int1合并成一個(gè)字符串,后面還會(huì)有大量這樣的使用
var.set(information())#刷新標(biāo)簽內(nèi)容var
#用于設(shè)定一個(gè)點(diǎn)擊位置的鼠標(biāo)坐標(biāo) def set_one_mouse_position(event): global mouse_position#引用全局變量mouse_position #做出判斷,是否設(shè)置的鼠標(biāo)坐標(biāo)已經(jīng)達(dá)到了設(shè)定的最大值,若未達(dá)到最大值,添#加鼠標(biāo)坐標(biāo)到mouse_position鏈表 if start_set==True and len(mouse_position)<target_quantity: x=mouse.position().x#獲取當(dāng)前鼠標(biāo)位置的x坐標(biāo) y=mouse.position().y#獲取當(dāng)前鼠標(biāo)位置的y坐標(biāo) ##對(duì)于設(shè)定的鼠標(biāo)位置做出判斷,是否可能在疊加點(diǎn)擊范圍的屬性上會(huì)超出屏幕范圍,并在設(shè)置后給出提醒或者警告 if x-click_range<0 or y-click_range<0: #鼠標(biāo)位置可能超出屏幕范圍,給出警告 showwarning(title='警告', message="%s%d%s%d%s"%('當(dāng)前位置(',x,',',y,')\n可能會(huì)出現(xiàn):自動(dòng)點(diǎn)擊時(shí)鼠標(biāo)不在桌面')) mouse_position.append([x,y]) showinfo(title='提示', message=("%s%d%s"%("位置",len(mouse_position),'設(shè)置成功'))) var.set(information())#刷新當(dāng)前設(shè)置內(nèi)容信息
注:
①showinfo(title=‘提示', message=("%s%d%s"%(“置”,len(mouse_position),‘設(shè)置成功')))
以對(duì)話框的形式彈出,給用戶提示,title(字符串)是對(duì)話框名字,message(字符串)是對(duì)話框文字內(nèi)容
② showwarning(title=‘警告', message="%s%d%s%d%s"%(‘當(dāng)前位置(',x,',',y,')\n可能會(huì)出現(xiàn):自動(dòng)點(diǎn)擊時(shí)鼠標(biāo)不在桌面'))
以對(duì)話框的形式彈出,給用戶警告
③關(guān)鍵字global,將已經(jīng)聲明的變量前加上global再次聲明的作用是:在當(dāng)前函數(shù)內(nèi)部對(duì)其值做出修改,并且函數(shù)返滬或結(jié)束時(shí),其被改變的值不會(huì)恢復(fù),(類似與C++的引用),
后面還有諸多函數(shù)內(nèi)部用到global關(guān)鍵字
④mouse.position()返回的是一個(gè)二元組,即當(dāng)前鼠標(biāo)的坐標(biāo)(x,y)
#功能函數(shù),用于設(shè)置單次點(diǎn)擊的次數(shù) def set_number_of_clicks(num): global number_of_clicks number_of_clicks=num var.set(information())
#功能函數(shù),用于設(shè)置點(diǎn)擊的時(shí)間間隔 def set_interval_time(time): global interval_time interval_time=time var.set(information())
#功能函數(shù),用于設(shè)置點(diǎn)擊位置的數(shù)量 def set_target_quantity(num): global target_quantity target_quantity=num var.set(information())
#功能函數(shù),開(kāi)始自動(dòng)點(diǎn)擊 def start_setting_coordinates(): global start_set,mouse_position,windows #當(dāng)start_set==False并且mouse_position鏈表當(dāng)中的元素個(gè)數(shù)還未達(dá)到最大值時(shí),繼續(xù)固定鼠標(biāo)坐標(biāo) if start_set==False and len(mouse_position)<target_quantity: start_set=True showinfo(title='提示', message="%s%d%s"%('開(kāi)始設(shè)置鼠標(biāo)坐標(biāo)\n一共需要設(shè)置',target_quantity,"個(gè)位置")) #當(dāng)start_set==True并且mouse_position鏈表當(dāng)中的元素個(gè)數(shù)達(dá)到最大值時(shí),開(kāi)始自動(dòng)點(diǎn)擊 elif start_set==True and len(mouse_position)>=target_quantity: showinfo(title='提示', message='鼠標(biāo)位置設(shè)置完畢,開(kāi)始自動(dòng)點(diǎn)擊') nim=0 while nim<total_number_of_times: for i in range(len(mouse_position)): #以鼠標(biāo)準(zhǔn)確位置為中心的正方形內(nèi)隨機(jī)選取點(diǎn)擊位置坐標(biāo) 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) #模擬點(diǎn)擊鼠標(biāo) mouse.click(mX,mY,button='left',clicks=number_of_clicks,interval=interval_time) #模擬移動(dòng)鼠標(biāo) mouse.moveTo(mX,mY) nim=nim+1 showinfo(title='提示', message="%s%d%s"%('點(diǎn)擊次數(shù)達(dá)到上限',total_number_of_times,'點(diǎn)擊結(jié)束')) #點(diǎn)擊次數(shù)達(dá)到最大次數(shù),點(diǎn)擊結(jié)束,清空鼠標(biāo)位置鏈表內(nèi)容,改變標(biāo)志變量和當(dāng)前設(shè)置信息 mouse_position.clear() start_set=False var.set(information())
注:
mouse.click(mX,mY,button=‘left',clicks=number_of_clicks,interval=interval_time)
模擬鼠標(biāo)在坐標(biāo)(mX,mY)出點(diǎn)擊,button指示點(diǎn)擊左鍵還是右鍵,clicks指示點(diǎn)擊次數(shù),interval指示點(diǎn)擊的時(shí)間間隔
mouse.moveTo(mX,mY)
移動(dòng)鼠標(biāo)到指定位置坐標(biāo)(mX,mY)
#功能函數(shù),設(shè)置點(diǎn)擊范圍 def start_setting_click_range(rangs): global click_range ti=rangs.get()#獲取rangs為本框的內(nèi)容(字符串) #對(duì)于輸入的內(nèi)容進(jìn)行差錯(cuò)處理 #當(dāng)字符串為空時(shí),設(shè)置點(diǎn)擊范圍click_range為0 if len(ti)==0: click_range=0 showwarning(title='警告', message='輸入內(nèi)容為空,當(dāng)前范圍為默認(rèn)值:0') return #當(dāng)字符串不為空時(shí),檢查每一個(gè)字符是否為數(shù)字的ascall碼 for j in range(len(ti)): if ti[j]>'9' or ti[j]<'0': showerror(title='錯(cuò)誤', message="%s%s%s"%('輸入內(nèi)容:\n',ti,'\n當(dāng)中含有非法字符')) return #將通過(guò)上方檢驗(yàn)的只含數(shù)字ascall碼的字符串轉(zhuǎn)化為整數(shù),若整數(shù)大于0,則更新點(diǎn)擊范圍為該值 ti=int(ti) if ti>0: click_range=ti showinfo(title='提示', message="%s%d"%('設(shè)置成功,點(diǎn)擊范圍為:',click_range)) var.set(information())
注:對(duì)于文本框內(nèi)容的獲取,需要綁定按鈕,通過(guò)在按鈕點(diǎn)擊功能函數(shù)當(dāng)中獲取,直接獲取無(wú)法取得
#功能函數(shù),設(shè)置點(diǎn)擊總次數(shù) 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='輸入內(nèi)容為空,當(dāng)前點(diǎn)擊總次數(shù)為默認(rèn)值:100') return for j in range(len(ti)): if ti[j]>'9' or ti[j]<'0': showerror(title='錯(cuò)誤', message="%s%s%s"%('輸入內(nèi)容:\n',ti,'\n當(dāng)中含有非法字符')) return ti=int(ti) if ti>0: total_number_of_times=ti showinfo(title='提示', message="%s%d"%('設(shè)置成功,點(diǎn)擊總次數(shù)為:',total_number_of_times)) var.set(information())
start_setting_click_times(times)對(duì)于輸入文本框的內(nèi)容查錯(cuò)處理和上一個(gè)函數(shù)相同,不再做介紹
### 主函數(shù) #### def main(): #初始化設(shè)置總菜單條,將菜單放在windows窗體上 menu_slect_num=tk.Menu(windows) #聲明第一個(gè)下拉單選菜單,將其放在總菜單條上 file_menu1=tk.Menu(menu_slect_num,tearoff=0) #設(shè)置第一個(gè)下拉菜單的菜單封面(封面標(biāo)簽) menu_slect_num.add_cascade(label='目標(biāo)數(shù)',menu=file_menu1) #添加可選菜單項(xiàng) file_menu1.add_radiobutton(label='1',command=lambda :set_target_quantity(1))#設(shè)置菜單項(xiàng)的標(biāo)簽,綁定功能 file_menu1.add_separator()#添加菜單項(xiàng)之間的分割線 ##后面繼續(xù)添加菜單項(xiàng),綁定功能 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))#設(shè)置菜單項(xiàng)的標(biāo)簽,綁定功能
command指的是功能函數(shù),只能將無(wú)參函數(shù)直接用函數(shù)名賦值給command, 對(duì)于有參函數(shù),需要以:command=lambda :有參函數(shù)(形參1,形參2…) 的形式賦值給command,不然無(wú)法正常觸發(fā)功能函數(shù)
#創(chuàng)建第二個(gè)下拉單選菜單,與第一個(gè)操作一樣 file_menu2=tk.Menu(menu_slect_num,tearoff=0) menu_slect_num.add_cascade(label='時(shí)間間隔',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))
#創(chuàng)建第三個(gè)下拉單選菜單,綁定功能,和上面的操作一樣 file_menu3=tk.Menu(menu_slect_num,tearoff=0) menu_slect_num.add_cascade(label='單次點(diǎn)擊數(shù)',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)#將菜單添加到窗體上 #添加標(biāo)簽和按鈕 #定義標(biāo)簽對(duì)象,設(shè)置目標(biāo)窗體,標(biāo)簽文本(text),背景顏色(bg),前景顏色(fg),字體(font),以及寬(width),高(height) lb1=tk.Label(windows,text="按Shift-A固定鼠標(biāo)或者退出自動(dòng)點(diǎn)擊",bg='black', fg='white', font=('Arial',12), width=40, height=2) lb2=tk.Label(windows,text="設(shè)置點(diǎn)擊范圍(像素點(diǎn),默認(rèn)為0):\n(以設(shè)置的鼠標(biāo)坐標(biāo)為中心展開(kāi))",bg='black', fg='white', font=('Arial', 12), width=40, height=2) lb3=tk.Label(windows,text="總點(diǎn)擊次數(shù)(默認(rèn)為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)
#定義按鈕對(duì)象,設(shè)置按鈕名稱,綁定功能函數(shù) 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)) #定義文本框,指定目標(biāo)窗體,設(shè)置輸入的文本為可見(jiàn)(show=None),設(shè)置文本字體font timi=tk.Entry(windows,show=None,font=('Arial', 14)) #放置按鈕和標(biāo)簽 lb4.pack() lb1.pack() b1.pack() lb2.pack() rang.pack() b2.pack() lb3.pack() timi.pack() b3.pack()
#為窗體綁定鍵盤(pán)監(jiān)聽(tīng)器,當(dāng)按下組合鍵(Shift-A),觸發(fā)功能函數(shù)set_one_mouse_position windows.bind("<Shift-A>",set_one_mouse_position) windows.mainloop()#使窗體內(nèi)容不斷刷新
main()
效果圖
到此這篇關(guān)于Python實(shí)戰(zhàn)之用tkinter庫(kù)做一個(gè)鼠標(biāo)模擬點(diǎn)擊器的文章就介紹到這了,更多相關(guān)Python tkinter庫(kù)鼠標(biāo)模擬點(diǎn)擊器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)類型學(xué)習(xí)筆記
這篇文章主要針對(duì)Python數(shù)據(jù)類型為大家進(jìn)行了詳細(xì)介紹,整理一篇關(guān)于Python數(shù)據(jù)類型的學(xué)習(xí)筆記,感興趣的小伙伴們可以參考一下2016-01-01django進(jìn)階之cookie和session的使用示例
這篇文章主要介紹了django進(jìn)階之cookie和session的使用示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08利用Python進(jìn)行時(shí)間序列數(shù)據(jù)分析與可視化的代碼示例
隨著時(shí)間序列數(shù)據(jù)在金融、氣象、生態(tài)等領(lǐng)域的廣泛應(yīng)用,利用Python進(jìn)行時(shí)間序列數(shù)據(jù)分析和可視化已成為重要的技能之一,本文將介紹如何使用Python進(jìn)行時(shí)間序列數(shù)據(jù)分析和可視化,并給出相應(yīng)的代碼示例,需要的朋友可以參考下2023-11-11Pandas中Series和DataFrame的索引實(shí)現(xiàn)
這篇文章主要介紹了Pandas中Series和DataFrame的索引實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python爬取qq空間說(shuō)說(shuō)的實(shí)例代碼
這篇文章主要介紹了Python爬取qq空間說(shuō)說(shuō)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-08-08正則化DropPath/drop_path用法示例(Python實(shí)現(xiàn))
DropPath 類似于Dropout,不同的是 Drop將深度學(xué)習(xí)模型中的多分支結(jié)構(gòu)隨機(jī)"失效",而Dropout是對(duì)神經(jīng)元隨機(jī)"失效"這篇文章主要給大家介紹了關(guān)于正則化DropPath/drop_path用法的相關(guān)資料,需要的朋友可以參考下2022-04-04Python3 實(shí)現(xiàn)串口兩進(jìn)程同時(shí)讀寫(xiě)
今天小編就為大家分享一篇Python3 實(shí)現(xiàn)串口兩進(jìn)程同時(shí)讀寫(xiě),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06python中pycryptodome模塊實(shí)現(xiàn)加密算法庫(kù)
PyCryptodome提供了許多密碼學(xué)算法和協(xié)議的實(shí)現(xiàn),包括對(duì)稱加密、非對(duì)稱加密、消息摘要、密碼哈希、數(shù)字簽名等,本文主要介紹了python中pycryptodome模塊實(shí)現(xiàn)加密算法庫(kù),感興趣的可以了解一下2023-11-11Sklearn多種算法實(shí)現(xiàn)人臉補(bǔ)全的項(xiàng)目實(shí)踐
本文主要介紹了Sklearn多種算法實(shí)現(xiàn)人臉補(bǔ)全的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03