python實現(xiàn)劃詞翻譯
最近因為編程,需要大量地看一些說明文檔,無奈說明文檔都是英文的,可把我這個半桶水折騰死了,太多詞匯不知道,一個個復制翻譯太麻煩了。于是我根據(jù)自己的需要,用python寫了一個劃詞翻譯。
一、使用邏輯
由于我是看PDF文檔,用的是一款輕量級的PDF閱讀器(SumatraPDF),這款閱讀器只有5M,但是閱讀很舒服很流暢,渲染也很到位。但是沒有其他閱讀器有許多強大功能,比如說劃詞翻譯。
我的想法是一旦發(fā)現(xiàn)我復制就可以在當前鼠標位置顯示一個翻譯結果框。基于這個想法,我一開始準備使用MFC編寫,因為MFC能夠輕易獲得系統(tǒng)消息,鉤子調用十分簡單。可是我把檢測復制,顯示文本框都做好的時候,發(fā)現(xiàn)一個悲傷的事實,c++的http庫實在是不怎么樣,竟然無法訪問http://地址,經(jīng)過一晚的嘗試——失敗,這才打算使用python。啰啰嗦嗦一大堆,我現(xiàn)在把我的邏輯說下吧。
二、需要引用的庫
因為要聯(lián)網(wǎng)所以需要urllib,解析網(wǎng)頁需要json,讀取剪切板數(shù)據(jù)需要win32clipboard,獲得當前鼠標信息用PyMouse,生成文本框Tkinter,定時器time。python為什么強大,就在于集成庫的易用性和多樣性,有什么需要就pip install 裝就行,這點比c++強太多了。
import urllib #http連接需要用到 import json #解析網(wǎng)頁數(shù)據(jù)用 import win32clipboard as wc #讀取剪切板數(shù)據(jù) from pymouse import PyMouse #獲得當前鼠標信息 import Tkinter #自帶的GUI庫,生成文本框 import time #定時器,減少占用
三、代碼實現(xiàn)
我這里先定義了三個函數(shù),方便后面實現(xiàn)功能,下面有詳細解釋和代碼
#PyMouse得到的是2維字符串,但是tkinter生成窗體時需要的是類似(100*100+x+y)的字符串,100*100是窗口大小,xy是坐標點。 def transMousePosition(): m = PyMouse() return "100x100+"+str(m.position()[0])+"+"+str(m.position()[1]) #獲得剪切板數(shù)據(jù) def getCopyText(): wc.OpenClipboard() copy_text = wc.GetClipboardData() wc.CloseClipboard() return copy_text #返會是否有新的復制數(shù)據(jù),cmp函數(shù)用于比較2個對象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 def newCopyData(): return cmp(currentData,str(getCopyText()))
主程序
if __name__ == '__main__': req_url = 'http://fanyi.youdao.com/translate' # 創(chuàng)建連接接口,這里是有道詞典的借口 # 創(chuàng)建要提交的數(shù)據(jù) currentData=str(getCopyText()) Form_Date = {} Form_Date['doctype'] = 'json' while 1: if newCopyData(): currentData=str(getCopyText())#取得當前剪切板數(shù)據(jù) Form_Date['i'] = currentData # 傳遞數(shù)據(jù) data = urllib.urlencode(Form_Date).encode('utf-8') #數(shù)據(jù)轉換 response = urllib.urlopen(req_url, data) #提交數(shù)據(jù)并解析 html = response.read().decode('utf-8') #服務器返回結果讀取 translate_results = json.loads(html) #以json格式載入 translate_results = translate_results['translateResult'][0][0]['tgt'] # json格式調取 position=transMousePosition()#取得當前鼠標位置 top = Tkinter.Tk()#窗口初始化 top.wm_attributes('-topmost',1)#置頂窗口 top.geometry(position)#指定定位生成指定大小窗口 e=Tkinter.Text()#生成文本框部件 e.insert(1.0,translate_results)#插入數(shù)據(jù) e.pack()#將部件打包進窗口 top.mainloop()# 進入消息循環(huán) currentData=str(getCopyText()) time.sleep(1)
到此,我們劃詞翻譯程序就已經(jīng)完成了,雖然不太美觀。而且美中不足的是我沒有想到一個好的辦法退出程序,相當于一個死循環(huán)在里面,只有強行退出,不知道誰有好辦法能夠解決這個問題
總結
如果要實現(xiàn)什么功能,python該是最好的膠水了,c++的http庫實在是太坑了,浪費我好多小時。下面源代碼附上,給大家參考
# -*- coding: utf-8 -*- """ Created on Sat Aug 11 08:24:48 2018 @author: ltengy """ import urllib #http連接需要用到 import json #解析網(wǎng)頁數(shù)據(jù)用 import win32clipboard as wc #讀取剪切板數(shù)據(jù) from pymouse import PyMouse #獲得當前鼠標信息 import Tkinter #自帶的GUI庫,生成文本框 import time #定時器,減少占用 currentData='' #PyMouse得到的是2維字符串,但是tkinter生成窗體時需要的是類似(100*100+x+y)的字符串,100*100是窗口大小,xy是坐標點。 def transMousePosition(): m = PyMouse() return "100x100+"+str(m.position()[0])+"+"+str(m.position()[1]) #獲得剪切板數(shù)據(jù) def getCopyText(): wc.OpenClipboard() copy_text = wc.GetClipboardData() wc.CloseClipboard() return copy_text #返會是否有新的復制數(shù)據(jù) def newCopyData(): return cmp(currentData,str(getCopyText())) if __name__ == '__main__': req_url = 'http://fanyi.youdao.com/translate' # 創(chuàng)建連接接口,這里是有道詞典的借口 # 創(chuàng)建要提交的數(shù)據(jù) currentData=str(getCopyText()) Form_Date = {} Form_Date['doctype'] = 'json' while 1: if newCopyData(): currentData=str(getCopyText())#取得當前剪切板數(shù)據(jù) Form_Date['i'] = currentData # 傳遞數(shù)據(jù) data = urllib.urlencode(Form_Date).encode('utf-8') #數(shù)據(jù)轉換 response = urllib.urlopen(req_url, data) #提交數(shù)據(jù)并解析 html = response.read().decode('utf-8') #服務器返回結果讀取 translate_results = json.loads(html) #以json格式載入 translate_results = translate_results['translateResult'][0][0]['tgt'] # json格式調取 position=transMousePosition()#取得當前鼠標位置 top = Tkinter.Tk()#窗口初始化 top.wm_attributes('-topmost',1)#置頂窗口 top.geometry(position)#指定定位生成指定大小窗口 e=Tkinter.Text()#生成文本框部件 e.insert(1.0,translate_results)#插入數(shù)據(jù) e.pack()#將部件打包進窗口 top.mainloop()# 進入消息循環(huán) currentData=str(getCopyText()) time.sleep(1)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
詳解Python 數(shù)據(jù)庫的Connection、Cursor兩大對象
這篇文章主要介紹了Python 數(shù)據(jù)庫的Connection、Cursor兩大對象,文中通過python 數(shù)據(jù)庫圖解給大家介紹的非常詳細,需要的朋友參考下吧2018-06-06python?Ajenti控制面板輕松地管理所有服務器網(wǎng)站
Ajenti是一個值得擁有的管理面板,免費開源的管理面板工具,可以幫助你集中管理多個服務器和網(wǎng)站,Ajenti?支持?Linux、BSD、Mac?OS?X和Windows?等多個操作系統(tǒng),并且可以通過一個直觀的?Web?界面來完成各種系統(tǒng)管理任務2024-01-01Django restful framework生成API文檔過程詳解
這篇文章主要介紹了Django restful framework生成API文檔過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11Python數(shù)組條件過濾filter函數(shù)使用示例
數(shù)組條件過濾簡潔實現(xiàn)方式,使用filter函數(shù),實現(xiàn)一個條件判斷函數(shù)即可,示例代碼如下2014-07-07