Python要玩你的鍵鼠——PyUserInput基礎(chǔ)教程

作為上班族每天要用鍵盤鼠標(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+3win+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更多的功能(如果有的話套媚,咕咕咕)。

敬請期待吧痘煤!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凑阶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衷快,更是在濱河造成了極大的恐慌,老刑警劉巖姨俩,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蘸拔,死亡現(xiàn)場離奇詭異,居然都是意外死亡环葵,警方通過查閱死者的電腦和手機(jī)调窍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來张遭,“玉大人邓萨,你說我怎么就攤上這事【站恚” “怎么了缔恳?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洁闰。 經(jīng)常有香客問我歉甚,道長,這世上最難降的妖魔是什么扑眉? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任纸泄,我火速辦了婚禮赖钞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聘裁。我一直安慰自己雪营,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布衡便。 她就那樣靜靜地躺著卓缰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砰诵。 梳的紋絲不亂的頭發(fā)上征唬,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機(jī)與錄音茁彭,去河邊找鬼总寒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛理肺,可吹牛的內(nèi)容都是我干的摄闸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼妹萨,長吁一口氣:“原來是場噩夢啊……” “哼年枕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乎完,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熏兄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后树姨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摩桶,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年帽揪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硝清。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡转晰,死狀恐怖芦拿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情查邢,我是刑警寧澤蔗崎,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站侠坎,受9級特大地震影響蚁趁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜实胸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一他嫡、第九天 我趴在偏房一處隱蔽的房頂上張望番官。 院中可真熱鬧,春花似錦钢属、人聲如沸徘熔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酷师。三九已至,卻和暖如春染乌,著一層夾襖步出監(jiān)牢的瞬間山孔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工荷憋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留台颠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓勒庄,卻偏偏與公主長得像串前,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子实蔽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容