Python使用Tkinter制作翻译软件(第16节)


在学习Python的过程中,很多人最担心的问题就是英语单词,总感觉自己英文不好,学习起来会很辛苦。其实Python对英文基础没有太高的要求,遇到有些不懂的英文单词时,可以直接通过“在线翻译”网站翻译英文单词。目前国内比较优秀的翻译网站包括百度翻译、有道翻译、360翻译、阿里翻译、搜狗翻译等,它们不仅支持多语言翻译,还能满足不同场景和需求。

对于英语比较差的人来说,虽然离不开在线翻译网站,但是我们完全可以通过Python自己制作做一个翻译软件。要想实现翻译的功能,我们可以使用Python的Tkinter库构建简单的可视化GUI图形用户界面。

1、翻译软件介绍

我们的目标是开发一个翻译软件,我们将使用Tkinter库分别创建用户登录界面和翻译界面。在用户登录界面中,如果输入的账号是“admin”,且输入的密码是“123456”,则提示登录成功,并跳转到翻译界面。一旦用户出现三次登录失败,则会自动终止程序。

在翻译界面,可以实现英语和中文之间的相互翻译,把要翻译的内容输入到文本框里,再点击“翻译”按钮,将在“翻译结果”框中输出翻译结果,可以翻译单词,也可以翻译多个英文段落。

2、翻译软件界面演示

Python使用Tkinter制作翻译软件

Python使用Tkinter制作翻译软件

3、代码实现

(1)安装faker库

首先,确保你已经安装了faker库。如果还没有安装,可以通过pip安装:

pip install faker

(2)导入必要的库

import tkinter as tk
from tkinter import scrolledtext, ttk, messagebox
import requests, time, sys
from faker import Faker

这里导入了Tkinter库用于创建GUI应用图形界面。requests库用来发送HTTP请求。time库用于处理时间相关的操作。sys库是与​Python解释器交互的核心标准库。Faker库是一个用于随机生成模拟数据的Python第三方库,主要用于生成看起来真实的测试数据,Faker库可以帮助开发者在测试阶段快速随机生成各种类型的虚拟数据,如姓名、地址、电子邮件、日期、文本、公司名等,虽然这些数据是假的,但看起来却像真实的数据,经常用于测试应用程序的表单验证、用户界面等场景‌。这里,我们利用Faker库创建一个随机虚拟的User-Agent(用户代理),它是Http协议中的一部分,属于请求头域的组成部分,User Agent也简称UA,是一个特殊的字符串头,是一种向目标访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核等信息的标识。

(3)实现翻译软件,完整代码如下所示:

import tkinter as tk
from tkinter import scrolledtext, ttk, messagebox
import requests, time, sys
from faker import Faker

# 随机生成伪数据,模拟生成客户端的环境信息
user = Faker().user_agent()
# 定义提交翻译的路径
url = 'https://fanyi.so.com/index/search'
# 定义HTTP请求头信息
headers = {
    'Pro': 'fanyi',
    'User-Agent': user
}

# 创建用户操作窗口
class TranslatorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("中英翻译器")
        # 设置窗口居中
        window_width = 490
        window_height = 570
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        self.root.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        self.root.resizable(width=False, height=False)

        # 创建“源语言”提示标签
        source_label = tk.Label(root, text="源语言:", font=('黑体', 12))
        source_label.grid(row=0, column=0, padx=10, pady=10)

        # 创建方向提示标签
        direction_label = tk.Label(root, text="-->", font=('黑体', 15))
        direction_label.grid(row=0, column=1, padx=10, pady=10)

        # 创建“目标语言”提示标签
        target_label = tk.Label(root, text="目标语言:", font=('黑体', 12))
        target_label.grid(row=0, column=2, padx=10, pady=10)

        # 创建第一个语言选择下拉菜单
        self.text_language1 = ['英语','中文']
        self.source_var = tk.StringVar(root)
        self.source_var.set('英语')  # 自动检测语言
        self.source_menu = ttk.Combobox(root, textvariable=self.source_var, values=self.text_language1, state='readonly', font=('黑体', 12))
        self.source_menu.grid(row=1, column=0, padx=10, pady=10)

        # 创建第二个语言选择下拉菜单
        self.text_language2 = ['英语','中文']
        self.target_var = tk.StringVar(root)
        self.target_var.set('中文')  # 默认英语
        self.target_menu = ttk.Combobox(root, textvariable=self.target_var, values=self.text_language2, state='readonly', font=('黑体', 12))
        self.target_menu.grid(row=1, column=2, padx=10, pady=10)

        # 创建输入框
        self.input_label = tk.Label(root, text="输入需要翻译的文本:", font=('黑体', 12))
        self.input_label.grid(row=2, column=0, columnspan=3, padx=10, pady=10)
        self.input_text = scrolledtext.ScrolledText(root, width=60, height=10)
        self.input_text.grid(row=3, column=0, columnspan=3, padx=20, pady=10)

        # 创建翻译按钮
        self.translate_button = tk.Button(root, text="翻译", font=('黑体', 15), command=self.translate_text, width=5, height=1)
        self.translate_button.grid(row=4, column=1, padx=10, pady=10)

        # 创建翻译结果显示区域
        self.output_label = tk.Label(root, text="翻译结果:", font=('黑体', 12))
        self.output_label.grid(row=5, column=0, columnspan=3, padx=10, pady=10)
        self.output_text = scrolledtext.ScrolledText(root, width=60, height=10)
        self.output_text.grid(row=6, column=0, columnspan=3, padx=20, pady=10)

    # 定义翻译函数
    def translate_text(self):
        # 获取输入的文本内容
        enter_text = self.input_text.get("1.0", tk.END)
        # 获取指定源语言
        source_language = self.source_var.get()
        # 获取目标语言
        target_language = self.target_var.get()
        if source_language == '英语' and target_language == '中文':
            # 下面是提交的表单参数
            information_data = {
                "eng": "1",
                "validate": "",
                "ignore_trans": "0",
                "query": enter_text
            }
        elif source_language == '中文' and target_language == '英语':
            information_data = {
                "eng": "0",
                "validate": "",
                "ignore_trans": "0",
                "query": enter_text
            }
        else:
            messagebox.showinfo("提示", "请选择要翻译的语言")
            return
        if enter_text.strip() == "":
            messagebox.showinfo("提示", "请输入要翻译的内容!")
        else:
            try:
                response = requests.post(url, headers=headers, data=information_data, proxies={"http": None, "https": None})
                status = response.status_code
                # ‌如果HTTP状态码是200,表示请求成功,服务器已成功返回请求的资源‌
                if status == 200 :
                    # 获取返回的json数据
                    data = response.json()
                    results = data['data']['fanyi']
                    time.sleep(2)
                    # 清空翻译结果
                    self.output_text.delete("1.0", tk.END)
                    # 显示翻译结果
                    self.output_text.insert(tk.END, results)
                else:
                    # ‌如果HTTP状态码不是200,则提示“翻译失败”
                    messagebox.showinfo("提示","翻译失败")
            except Exception as e:
                messagebox.showerror("错误", str(e))

# 创建登录窗口
class LoginWindow(object):
    def __init__(self):
        self.window = tk.Tk()
        # 声明账号和密码两个变量
        self.username = tk.StringVar()
        self.password = tk.StringVar()
        self.count=3
        self.createForm()
    def login(self):
        # 判断如果输入的账号是“admin”和密码是“123456”,则登录成功
        if self.username.get()=='admin' and self.password.get()=='123456':
            messagebox.showinfo('登录', '登录成功!')
            # 如果登录成功,则关闭登录窗口
            self.window.destroy()
            # 加载翻译主程序界面
            root = tk.Tk()
            app = TranslatorApp(root)
            root.mainloop()
        # 判断用户输入错误的次数,大于3次就结束程序
        elif self.count==0:
            messagebox.showinfo('警告!', '非法入侵!\n启动自动销毁模式!!!')
            self.window.quit()
            sys.exit(0)
        else:
            messagebox.showinfo('失败!', '账号或密码错误,你还有%d次机会' % self.count)
        self.count-=1

    # 定义退出函数
    def user_quit(self):
        self.window.destroy()

    def createForm(self):
        self.window.title('用户登录')
        # 设置窗口居中
        window_width = 280
        window_height = 200
        screen_width = self.window.winfo_screenwidth()
        screen_height = self.window.winfo_screenheight()
        x = (screen_width - window_width) / 2
        y = (screen_height - window_height) / 2
        self.window.geometry('%dx%d+%d+%d' % (window_width, window_height, x, y))
        self.window.resizable(width=False, height=False)
        # 创建“用户名”标签
        name_label = tk.Label(self.window,text='用户名:',justify=tk.RIGHT,width = 100)
        name_label.place(x=35,y=50,width=80,height=20)
        # 创建“用户名”输入框
        name_entry = tk.Entry(self.window, width=150, textvariable=self.username)
        name_entry.place(x=110, y=50, width=120, height=20)
        # 创建“密码”标签
        password_label = tk.Label(self.window,text='密  码:', justify=tk.RIGHT,width=80)
        password_label.place(x=35, y=80, width=80, height=20)
        # 创建“密码”输入框
        password_entry = tk.Entry(self.window, width=150,textvariable=self.password)
        password_entry.place(x=110, y=80, width=120, height=20)
        # 创建“登录”按钮
        login_button = tk.Button(self.window,text='登录',command=self.login)
        login_button.place(x=85,y=130,width=50,height=20)
        # 创建“退出”按钮
        quit_button = tk.Button(self.window,text='退出',command=self.user_quit)
        quit_button.place(x=155,y=130,width=50,height=20)
        self.window.mainloop()

# 当前模块直接被执行
if __name__ == "__main__":
    # 启动登录窗口函数
    LoginWindow()