前言
由於工作需要,要利用某軟件去采集數據,做重復的動作大概500多次。所以想寫一個程序代替人,去點擊和輸入。
一開始的思路有兩個:1、用Python或者windows對此軟件直接操作。2、利用Python模擬鼠標和鍵盤操作,模擬人工去操作此軟件。
第一種想法比較難實現,因為首先是沒有此軟件的接口,沒辦法進入它的后台。其次是Python沒有這樣的功能庫。
第二種想法容易實現,但是有一個問題,是Python沒辦法接收軟件的反饋,並作出判斷,只能按照既定的鼠標和鍵盤設置進行操作。
准備工具
“看鼠標”軟件
Python的PyUserInput庫(它的依賴庫有pyhook,pyhook的依賴庫為pywin32)
如果是在anaconda里面安裝pyhook的話,有可能還需要安裝個msgpack
實施
采集工具如下圖:
需要對它的界面點擊和輸入:“單位列表”→輸入單位編號→回車→“數據采集”(等待5-10秒)→“上一步”
然后循環這個操作
點擊的位置基本都是不變的,也不需要做判斷,所以用pymouse和pykeyboard來操作比較方便。
由於pymouse需要填寫鼠標的X,Y定位,所以需要利用一個叫“看鼠標”的小軟件去實行。
from pymouse import PyMouse import time from pykeyboard import PyKeyboard def del_all(): """ 清空文本框 """ k.press_key(k.control_key) k.tap_key('A') k.release_key(k.control_key) k.tap_key(k.delete_key) def click_and_type(word): time.sleep(0.5) m.click(536, 531, 1)#點擊“單位列表” time.sleep(0.5) del_all() k.type_string(word)#輸入單位編碼 time.sleep(1) k.tap_key(k.entry_key,1)#等它感應到對應單位后回車 time.sleep(0.5) m.click(1121, 732, 1)#點擊“數據采集” time.sleep(10)#等待數據采集完畢,一般3秒左右完成,但需要預留多一點時間確保 m.click(1119,738,1)#點擊“上一步” #主體執行部分 list_num=['A1002002','B213212']#實際執行過程中有500多個單位,這里只展示兩個 m = PyMouse() k = PyKeyboard() m.click(1600, 900, 1)#顯示桌面 time.sleep(0.5) m.click(324, 872, 1)#顯示軟件 for i in range(len(list_num)): word = list_num[i] click_and_type(word)
然后程序就自動化的執行起來。在這類小程序的測試階段,最好將腳本備份一下,將無關程序關閉。因為當你操作的小程序有意外情況時,你在強行停止程序的過程中有可能影響到腳本。
附言
在模擬的鼠標和鍵盤的時候,總是無法對程序的反饋做一個感應和判斷。譬如操作的程序彈出一個對話框,Python模擬鼠標鍵盤的程序也只能繼續跑下去。
雖然暫時沒有辦法感應到窗口,但是可以利用win32con和win32clipboard兩個庫,讀取到windows的剪切板,從而對軟件的文本進行一個讀取。這個也算是
一個交互的方式。下面將相關的腳本奉上,供大家參考。
import win32con import win32clipboard as w def get_text(): """ 讀取剪切板 """ w.OpenClipboard() t = w.GetClipboardData(win32con.CF_TEXT) w.CloseClipboard() a = t.decode('ANSI')#部分文本需要這個解碼,顯示中文 return a
good luck!