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