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()

运行结果如下:



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

你可能感兴趣的:(PySimpleGUI + 有道翻译 写一个简单的翻译软件)