PySimpleGUI + 有道翻译 写一个简单的翻译软件

网易的有道智云,提供了各种 Api,一部分呢可以免费试用。

这里使用自然语言翻译的 Api 来写一个简单的翻译软件。


获取 Api

首先呢,登录有道智云,网易账号可以直接登录。

创建应用

首先进入我的应用,先创建一个应用。


进入应用创建界面:

再进入 自然语言翻译>创建一个实例,最后再右边绑定应用即可。

回到我的实例,点击实例进入实例详情页面:

查看你的 应用ID应用密钥,后面调用翻译接口的时候会用到。

查看 API 文档

要调用接口,肯定必须要知道接口地址、请求方法、参数、返回值。否则你都没法调用。

有道智云每个接口都有非常详细的 API 和不同原因的调用示例(毕竟是赚钱的嘛,写不清楚别人用不了),点这里进入翻译 API 文档

文档有兴趣的同学可以看看,这对于了解前后端开发的文档沟通过程和理解接口测试很有帮助。

或者你可以直接搜索 Python3 示例,下面的代码我修改了一下,你只需要把上面你的应用ID和应用密钥填进去即可。

# -*- coding: utf-8 -*-
import sys
import uuid
import requests
import hashlib
import time

YOUDAO_URL = 'https://openapi.youdao.com/api'
APP_KEY = '您的应用ID'
APP_SECRET = '您的应用密钥'

def encrypt(signStr):
    hash_algorithm = hashlib.sha256()
    hash_algorithm.update(signStr.encode('utf-8'))
    return hash_algorithm.hexdigest()

def truncate(q):
    if q is None:
        return None
    size = len(q)
    return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]

def connect(q):
    data = {}
    data['from'] = 'auto'
    data['to'] = 'auto'
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['q'] = q
    data['salt'] = salt
    data['sign'] = sign
    
    return requests.post(YOUDAO_URL, data=data, headers=headers).json()

if __name__ == '__main__':
    from pprint import pprint 
    pprint(connect('test'))

运行一下,可以看到返回的 JSON 数据:

{'basic': {'exam_type': ['高中', '初中'],
           'explains': ['n. 测验,考查;测试;检验;化验', 'v. 测验;化验,检查;试验,测试;考验'],
           'phonetic': 'test',
           'uk-phonetic': 'test',
           'uk-speech': 'http://openapi.youdao.com/ttsapi?q=test&langType=en&sign=24FBE24DDFAA2AD763C2B2D9BA8645A3&salt=1571234222837&voice=5&format=mp3&appKey=4aaf4f0434b6bd8e',
           'us-phonetic': '',
           'us-speech': 'http://openapi.youdao.com/ttsapi?q=test&langType=en&sign=24FBE24DDFAA2AD763C2B2D9BA8645A3&salt=1571234222837&voice=6&format=mp3&appKey=4aaf4f0434b6bd8e'},
 'dict': {'url': 'yddict://m.youdao.com/dict?le=eng&q=test'},
 'errorCode': '0',
 'l': 'en2zh-CHS',
 'query': 'test',
 'returnPhrase': ['test'],
 'speakUrl': 'http://openapi.youdao.com/ttsapi?q=test&langType=en&sign=24FBE24DDFAA2AD763C2B2D9BA8645A3&salt=1571234222837&voice=4&format=mp3&appKey=4aaf4f0434b6bd8e',
 'tSpeakUrl': 'http://openapi.youdao.com/ttsapi?q=%E6%B5%8B%E8%AF%95&langType=zh-CHS&sign=A83C7003EFF5A97BAD6FE023F95D4FBE&salt=1571234222837&voice=4&format=mp3&appKey=4aaf4f0434b6bd8e',
 'translation': ['测试'],
 'web': [{'key': 'Test', 'value': ['测试', '测验', '试验', '考试']},
         {'key': 'Test engineer',
          'value': ['测试工程师', '测试员', '软件测试工程师', '产品试验工程师']},
         {'key': 'stress test', 'value': ['压力测试', '应力测试', '负荷试验', '压力试验']}],
 'webdict': {'url': 'http://m.youdao.com/dict?le=eng&q=test'}}

返回内容很复杂,我相信业务繁忙的各位也没太多心思细看。(详细的说明可以查看接口文档)

这里我们只做简单的翻译,所以只取其中的 translation 部分。

简单的设计界面

简单的翻译,先不要考虑那么多,能输入要翻译的内容,并且把翻译后的输出即可。



这里只设计了两行:

  • 第一行,一个多行文本输入区域,一个翻译按钮;
  • 第二行,一个 Frame 框架内部嵌套一个多行文本输出区域(最能查看不能修改)。

在 PySimpleGUI 中,Multiline可以作为多行文本输入区域,也可以作为多行文本输出区域。

sg.Multiline('')

之前一篇文章也演示过 PySimpleGUI 的基本用法, PySimpleGUI 中布局使用的是列表。把页面元素都加到列表中,在把列表加入窗口布局。

如果用到 Frame,Frame 本身也是一个列表,要先把元素加到 Frame 的列表中,再把 Frame 加入到整体布局列表中,最后再把整体布局列表加入窗口。

simple_frame = [[sg.Multiline('', key='_RES_', disabled=True)]]

layout = [[sg.Multiline('', key='_Q_', focus=True), sg.Button('翻译', key='_TRANS_')],
          [sg.Frame('翻译结果', simple_frame, title_color='gray')],]

翻译按钮的 _key='TRANS_',那么当窗口事件为 _TRANS_ 时就调用有道翻译接口,把从多行文本key='_Q_'中读取的文本内容传递过去,然后把返回结果中的 translation 部分展示在下方 Frame 中的输出文本中。

import PySimpleGUI as sg
import os, sys
from yodao import connect  # 把上面的有道获取的代码保存为 yodao.py

# 构造 Frame
simple_frame = [[sg.Multiline('', key='_RES_', disabled=True)]]

# 构造整体窗口布局
layout = [[sg.Multiline('', key='_Q_', focus=True), sg.Button('翻译', key='_TRANS_')],
          [sg.Frame('翻译结果', simple_frame, title_color='gray')]]

# 生成窗口
window = sg.Window('翻译小工具', layout)

while True:
    event, value = window.Read()
    
    # 如果点击翻译按钮
    if event == '_TRANS_':
        result = connect(value.get('-Q-')).get('translation')[0]
        # 把翻译结果展示到Frame中的文本区域
        window['_RES_'].update(result)
        
    if event is None:
        break

window.close()

运行结果如下:



😳,没有做任何异常处理和稳定性代码,请自行添加。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355