作為上班族每天要用鍵盤鼠標(biāo)進(jìn)行一些機(jī)械的輸入和點(diǎn)擊椎椰,會消耗掉不少的時(shí)間精力毛仪。
游戲族每天還要刷同樣的副本好幾十次,真的也十分枯燥乏味贬丛。
那么有沒有什么辦法可以讓鍵盤鼠標(biāo)自己動起來,解放我們聰明的大腦呢鹃共?
有鬼佣,用腳本
雖然對于鍵盤鼠標(biāo)腳本而言,市面上已經(jīng)有非常強(qiáng)大的軟件-按鍵精靈及汉。它基本可以滿足任何你對鍵盤鼠標(biāo)操作的想法沮趣,對于簡單的腳本屯烦,只需要使用錄制功能就可以讓腳本幫你重復(fù)機(jī)械性的操作坷随。
而對于更高級的按鍵輸入需求,按鍵精靈基于VBscript研發(fā)了Q語言驻龟,去掉了VBscript的一些功能温眉,用于開發(fā)其按鍵腳本。所以懂得使用VBscript的朋友也可以直接在里面編輯腳本翁狐。
不過雖然按鍵精靈功能十分強(qiáng)大且易用类溢,但是VBscript的受眾面相對較小(也有可能是因?yàn)槲也欢胚@么覺得)露懒,Q語言學(xué)習(xí)的復(fù)用性又不強(qiáng)闯冷。另外按鍵精靈官方的教程并不十分齊全,有些高級教程竟然需要會員才可以解鎖查看懈词。這十分不符合知識共享精神蛇耀。
那么,既然我們會點(diǎn)Python坎弯,那當(dāng)然是要用Python來搞點(diǎn)事情纺涤。
不過,這個(gè)事情早就有人搞過了抠忘。Paul Barton等人基于Pepijn de Vos的PyMouse包整合優(yōu)化形成了PyUserInput包撩炊,用于在各大操作系統(tǒng)中監(jiān)視鍵盤鼠標(biāo)事件。源代碼地址如下:
https://github.com/PyUserInput/PyUserInput
PyUserInput是一個(gè)面向python用于跨平臺控制鼠標(biāo)和鍵盤的模塊崎脉,使用簡單拧咳。在Windows、Mac和X11(大多數(shù)Linux)系統(tǒng)上囚灼,鼠標(biāo)控制應(yīng)該都能正確運(yùn)行骆膝。鼠標(biāo)的滾動也是可以實(shí)現(xiàn)的,不過鼠標(biāo)滾動本身在各操作系統(tǒng)和各應(yīng)用程序之間就存在差異啦撮,用戶在使用之時(shí)需要注意谭网。鍵盤控制在X11(Linux)和Windows系統(tǒng)上都沒有問題,而Mac系統(tǒng)上的鍵盤輸入還待優(yōu)化赃春。
那么愉择,讓我們用PyUserInput這個(gè)小工具包,解放我們的雙手。
LET'S GOOOOOOOOOOO !
安裝
依賴包
根據(jù)你使用的操作系統(tǒng)锥涕,需要為PyUserInput安裝依賴包:
- Linux:Xlib (python-xlib)
- Mac:Quartz, AppKit
- Windows:pywin32, pyHook
如果未成功安裝上述依賴包衷戈,那么在安裝PyUserInput時(shí)就會報(bào)錯(cuò)。
Windows 依賴包
這里我們著重介紹一下层坠,Window系統(tǒng)下的依賴包殖妇。Windows上的PyUserInput依賴于pywin32。pywin32是用于Windows系統(tǒng)的Python拓展包破花,它包含了幾乎所有的Windows API谦趣,可以很方便地從Python直接調(diào)用,還可以創(chuàng)建并使用COM對象座每。你可以訪問下面的網(wǎng)址進(jìn)行下載安裝:
http://sourceforge.net/projects/pywin32/files/pywin32/
這里需要自行選擇與已有的Python版本相對應(yīng)的文件進(jìn)行下載前鹅。
使用pip
PyUserInput在PyPI上(Python Package Index,Python庫索引)注冊并更新峭梳,所以用pip安裝會很方便舰绘,只需要在終端入以下代碼:
pip install PyUserInput
使用源代碼
你可以從下面github里下載zip文件,也可以從PyPI里下載包含源碼的tar.gz文件葱椭。
https://github.com/PyUserInput/PyUserInput/archive/master.zip
將文件解壓縮到目錄后捂寿,打開終端,指向剛剛解壓的包含setup.py的目錄孵运。然后輸入以下命令:
python setup.py install
如果是Linux系統(tǒng)中秦陋,可能存在權(quán)限問題,那么就需要在命令前加上sudo
掐松。經(jīng)過親身體驗(yàn)踱侣,由于網(wǎng)絡(luò)等問題,使用pip安裝可能會失敗大磺,這里推薦使用源代碼安裝抡句,并且手動安裝依賴包。
新手上路
在成功安裝了PyUserInput之后杠愧,你的Python路徑中應(yīng)該會包含pymouse和pykeyboard兩個(gè)模塊了待榔。想讓Python幫你使用鼠標(biāo)鍵盤,就要先創(chuàng)建鼠標(biāo)和鍵盤對象:
from pymouse import PyMouse
from pykeyboard import PyKeyboard
m = PyMouse()
k = PyKeyboard()
上面的PyMouse()
類和PyKeyboard()
類流济,就是鼠標(biāo)和鍵盤的對象锐锣。之后所有的操作,基本都包含在這兩個(gè)類的方法中绳瘟。接下來讓我們嘗試點(diǎn)擊一下屏幕中央雕憔,并用鍵盤輸入:"Hello, World!"
x_dim, y_dim = m.screen_size()
m.click(x_dim/2, y_dim/2, 1, 1)
k.type_string('Hello, World!')
鼠標(biāo)對象擁有screen_size()
方法,用于返回當(dāng)前使用屏幕的尺寸糖声。鼠標(biāo)和鍵盤對象的click()
方法和type_string()
方法斤彼,顧名思義分瘦,就是使用鼠標(biāo)點(diǎn)擊,用鍵盤輸入琉苇。click()
方法需要傳遞4個(gè)參數(shù)嘲玫,前兩個(gè)參數(shù)分別是希望鼠標(biāo)點(diǎn)擊的X坐標(biāo)和Y坐標(biāo);第三個(gè)參數(shù)為需要點(diǎn)擊的鼠標(biāo)按鍵并扇,1為左鍵去团,2為右鍵,3為中鍵穷蛹;第四個(gè)參數(shù)為點(diǎn)擊次數(shù)土陪。
此外PyKeyboard還提供了一系列輸入按鍵的方式:
# pressing a key
k.press_key('H')
# which you then follow with a release of the key
k.release_key('H')
# or you can 'tap' a key which does both
k.tap_key('e')
# note that that tap_key does support a way of repeating keystrokes with a interval time between each
k.tap_key('l',n=2,interval=5)
# and you can send a string if needed too
k.type_string('o World!')
上面顯示的方法其實(shí)十分容易理解,press_key()
和release_key()
即為按下俩莽,松開按鍵旺坠,tap_key()
為點(diǎn)擊按鍵乔遮,這個(gè)方法有三個(gè)參數(shù)可供傳遞扮超,第一個(gè)參數(shù)為需要點(diǎn)擊的鍵位,可以用字符的形式輸入蹋肮;第二個(gè)參數(shù)為點(diǎn)擊的次數(shù)出刷,默認(rèn)為1;第三個(gè)參數(shù)為點(diǎn)擊間隔的時(shí)間坯辩,單位為秒馁龟,默認(rèn)為0。但是漆魔,鍵盤上還有一些特殊的按鍵(比如shift坷檩,ctrl,enter等)改抡,無法用字符的形式輸入怎么辦矢炼?不用擔(dān)心,PyKeyboard也提供了一系列特殊按鍵的輸入方式:
#Create an Alt+Tab combo
k.press_key(k.alt_key)
k.tap_key(k.tab_key)
k.release_key(k.alt_key)
k.tap_key(k.function_keys[5]) # Tap F5
k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad
k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice
上面的代碼就展示了阿纤,對alt鍵句灌,tab鍵,F(xiàn)5鍵欠拾,Home鍵胰锌,小鍵盤的操作方法。PyKeyboard把這些特殊的按鍵定義成了類屬性了藐窄,在調(diào)用時(shí)輸入屬性即可资昧。然而這種表示方法可能有些難記,并且鍵盤上的特殊按鍵很多荆忍,一一展示顯得過于冗長格带。大家可以打開從GitHub中下載的源碼诺凡,打開pykeyboard文件夾,找到當(dāng)前操作系統(tǒng)適用的.py
文件践惑,就可以看到里面的special_key_assignment腹泌,這里定義了所有特殊按鍵的屬性,大家可以根據(jù)這個(gè)表找到自己想要輸入的鍵位尔觉。
如果大家有興趣打開所有的.py
文件看看里面內(nèi)容的話凉袱,大概會發(fā)現(xiàn),每個(gè)操作系統(tǒng)的特殊按鍵都十分不同侦铜。因?yàn)閷τ阪I盤鼠標(biāo)的輸入专甩,在各個(gè)操作平臺間保持一致性是一個(gè)很大的挑戰(zhàn)。比如像這樣:
# Windows
k.tap_key(k.alt_key)
# Mac
k.tap_key('Alternate')
Mac和Windows中钉稍,alt鍵的輸入方法就不一樣涤躲。所以大家最好打開源代碼學(xué)習(xí)一下,以方便記憶和理解贡未。
使用按鍵輸入還有一個(gè)情況种樱,雖然普通按鍵可以使用type_string()
進(jìn)行連續(xù)輸入,那么特殊按鍵無法使用字符俊卤,該如何進(jìn)行連續(xù)輸入呢嫩挤?這里需要使用press_keys()
方法來輸入多個(gè)按鍵(一般在使用鍵盤快捷鍵時(shí)常出現(xiàn)這樣的情況):
# Mac example
k.press_keys(['Command','shift','3'])
# Windows example
k.press_keys([k.windows_l_key,'d'])
上面的例子,分別在Mac和Windows中消恍,輸入了command+shift+3
和win+d
岂昭。
上面的內(nèi)容已經(jīng)基本囊括了鍵盤和鼠標(biāo)的基本輸入方式,我們已經(jīng)可以用這些方法編寫滿足很多功能的程序了狠怨。但是這些程序有一個(gè)問題约啊,就是當(dāng)我們編寫完并開始運(yùn)行之后,程序就按照我們編寫的內(nèi)容執(zhí)行了佣赖,我們無法在程序中進(jìn)行交互恰矩。或者說茵汰,有時(shí)我們需要一個(gè)開關(guān)枢里,在點(diǎn)下某個(gè)按鍵之后,執(zhí)行某一部分功能蹂午。讓我們來看看高級玩法栏豺。
高級玩法
如果我們的程序需要實(shí)現(xiàn)交互或者開關(guān)功能,就要特別介紹一下pymouse和pykeyboard中兩個(gè)特殊的類:PyMouseEvent和PyKeyboardEvent豆胸。這兩個(gè)對象是監(jiān)控鼠標(biāo)和鍵盤輸入的框架奥洼,你必須將其子類化,然后它們就可以通過監(jiān)控鼠標(biāo)鍵盤輸入晚胡,來實(shí)現(xiàn)一些其他的功能灵奖。這里有一個(gè)PyMouseEvent子類化的例子:
from pymouse import PyMouseEvent
def fibo():
a = 0
yield a
b = 1
yield b
while True:
a, b = b, a+b
yield b
class Clickonacci(PyMouseEvent):
def __init__(self):
PyMouseEvent.__init__(self)
self.fibo = fibo()
def click(self, x, y, button, press):
'''Print Fibonacci numbers when the left click is pressed.'''
if button == 1:
if press:
print(self.fibo.next())
else: # Exit if any other mouse button used
self.stop()
C = Clickonacci()
C.run()
上面的代碼我們定義了一個(gè)PyMouseEvent類的子類:Clickonacci類嚼沿。并且,我們對Clickonacci類定義了一個(gè)fibo
屬性瓷患,并且在Clickonacci類的click()
方法中調(diào)用它骡尽。這個(gè)click()
方法的功能就是,每當(dāng)按下鼠標(biāo)左鍵時(shí)擅编,打印一個(gè)斐波那契數(shù)列中的數(shù)攀细,當(dāng)按下一個(gè)任意別的鍵時(shí),程序停止爱态。這樣我們成功就給程序設(shè)置了一個(gè)開關(guān)谭贪。
上面所有的示例代碼,基本可以囊括我們?nèi)粘P枰某绦蛐枨罅私醯!N覀兊幕A(chǔ)教程也先展示到這里俭识,當(dāng)然PyUserInput的特性還不止如此,有興趣的朋友可以打開源代碼學(xué)習(xí)洞渔。希望在未來的文章中能用一個(gè)小項(xiàng)目來展示PyUserInput更多的功能(如果有的話套媚,咕咕咕)。
敬請期待吧痘煤!