zoukankan      html  css  js  c++  java
  • 基于百度通用翻译API的一个翻译小工具

    前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发者账号,把当前翻译接口替换为百度翻译接口。

    1.首先注册一个百度个人开发者账号

    http://api.fanyi.baidu.com/api/trans/product/index

    注册完成后会得到一个APP ID和密钥

    2.打开“文档与支持/通用翻译API技术文档”

    这里面介绍了如何调用百度翻译接口

    下面是完整的代码

    第59行写明如何调用百度翻译API以及参数的构造方法,同时相对之前的版本,修改了下页面按钮的布局

      1 # -*- coding:utf-8 -*-
      2 
      3 import requests
      4 from requests.exceptions import RequestException
      5 import tkinter as tk
      6 from tkinter import ttk
      7 import hashlib
      8 import random
      9 
     10 class Translate():
     11     def __init__(self):
     12         self.window = tk.Tk()  #创建window窗口
     13         self.window.title("简易翻译器")  # 定义窗口名称
     14         # self.window.resizable(0,0)  # 禁止调整窗口大小
     15         self.menu = ttk.Combobox(self.window,width=6)
     16         self.input = tk.Entry(self.window, width=80)  # 创建一个输入框,并设置尺寸
     17         self.info = tk.Text(self.window, height=20)   # 创建一个文本展示框,并设置尺寸
     18 
     19         self.menu['value'] = ('转成繁体中文','转成英文', '转成日文', '转成韩文', '转成阿拉伯文')
     20         self.menu.current(0)
     21 
     22         # 添加一个按钮,用于触发翻译功能
     23         self.t_button = tk.Button(self.window, text='翻译', relief=tk.RAISED, width=8, height=1, command=self.fanyi)
     24         # 添加一个按钮,用于触发清空输入框功能
     25         self.c_button1 = tk.Button(self.window, text='清空输入', relief=tk.RAISED, width=8, height=1, command=self.cle_e)
     26         # 添加一个按钮,用于触发清空输出框功能
     27         self.c_button2 = tk.Button(self.window, text='清空输出', relief=tk.RAISED,width=8, height=1, command=self.cle)
     28         # 添加一张图标
     29         self.image_file = tk.PhotoImage(file='py128.png')
     30         self.label_image = tk.Label(self.window, image=self.image_file)
     31 
     32     def gui_arrang(self):
     33         """完成页面元素布局,设置各部件的位置"""
     34         self.input.grid(row=0,column=0,padx=5,pady=5)
     35         self.info.grid(row=1,rowspan=2,column=0,padx=5,pady=5)
     36 
     37         self.t_button.grid(row=0,column=1,padx=5,pady=5,sticky=tk.W)
     38         self.c_button1.grid(row=0,column=2,padx=0,pady=5,sticky=tk.W)
     39         self.c_button2.grid(row=0,column=3,padx=5,pady=5,sticky=tk.W)
     40 
     41         self.menu.grid(row=1, column=1, padx=5, pady=5, rowspan=2, sticky=tk.NW)
     42 
     43         self.label_image.grid(row=2, column=1,columnspan=3,sticky=tk.N)
     44 
     45     def tran_type(self):
     46         type = None
     47         if self.menu.get() == "转成繁体中文":
     48             type = "cht"
     49         if self.menu.get() == "转成英文":
     50             type = "en"
     51         elif self.menu.get() == "转成日文":
     52             type = "jp"
     53         elif self.menu.get() == "转成韩文":
     54             type = "kor"
     55         elif self.menu.get() == "转成阿拉伯文":
     56             type = "ara"
     57         return type
     58 
     59     def fanyi(self):
     60         """定义一个函数,完成翻译功能"""
     61 
     62         original_str = self.input.get()  # 定义一个变量,用来接收输入框输入的值
     63         appid = 'XXXX'  # 你的appid
     64         secretKey = 'XXXX'  # 你的密钥
     65 
     66         salt = random.randint(32768, 65536)   # 生成一个随机数
     67         sign = appid + original_str + str(salt) + secretKey  # 将appid和要翻译的字符、随机数、密钥组合成一个原始签名
     68         m = hashlib.new("md5")  
     69         m.update(sign.encode(encoding="utf-8"))  # 注意使用utf-8编码
     70         msign = m.hexdigest() # 得到原始签名的MD5值
     71 
     72         data = {
     73             "q": original_str,   
     74             "from": "auto",
     75             "to": self.tran_type(),
     76             "appid": appid,
     77             "salt": salt,
     78             "sign": msign
     79         }
     80         url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
     81         try:
     82             r = requests.get(url, params=data)
     83             if r.status_code == 200:
     84                 result = r.json()
     85                 translate_result = result["trans_result"][0]["dst"]
     86                 self.info.delete(1.0, "end")  # 输出翻译内容前,先清空输出框的内容
     87                 self.info.insert('end',translate_result)  # 将翻译结果添加到输出框中
     88         except RequestException:
     89             self.info.insert('end', "发生错误")
     90     def cle(self):
     91         """定义一个函数,用于清空输出框的内容"""
     92         self.info.delete(1.0,"end")  # 从第一行清除到最后一行
     93 
     94     def cle_e(self):
     95         """定义一个函数,用于清空输入框的内容"""
     96         self.input.delete(0,"end")
     97 
     98 def main():
     99     t = Translate()
    100     t.gui_arrang()
    101     tk.mainloop()
    102 
    103 if __name__ == '__main__':
    104     main()

    最终效果如下

    ps.下面是通用翻译API服务的使用详情,每天都会统计

  • 相关阅读:
    Python(八)进程、线程、协程篇
    Python(七)Socket编程、IO多路复用、SocketServer
    Python(六)面向对象、异常处理、反射、单例模式
    Python并发编程之多进程
    ORM框架SQLAlchemy
    Python并发编程之IO模型
    Python并发编程之同步异步and阻塞非阻塞
    二分查找
    插入排序
    单向链表
  • 原文地址:https://www.cnblogs.com/hanmk/p/10734739.html
Copyright © 2011-2022 走看看