python 制作一个gui界面的翻译工具


Posted in Python onMay 14, 2021

一.准备工作

除了Tkinter,还需要google_trans_new,没有安装这个库的朋友,可以使用

pip install google_trans_new

安装一下。

二.预览

1.主界面

python 制作一个gui界面的翻译工具

2.翻译

python 制作一个gui界面的翻译工具

3.支持多种语言哦

python 制作一个gui界面的翻译工具

三.源代码

设计流程很简单,这里就直接贴代码了

3.1 My_Translator-v2.0.py

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import pyperclip
import threading
from tkinter.filedialog import askopenfilename
from Translator import Do_Trans

"""
使用combobox进行语言记录
"""

class App:
    def __init__(self):
        self.window=Tk()
        self.window.title('翻译器-v2.0')
        width=480
        height=480
        left=(self.window.winfo_screenwidth()-width)/2
        top=(self.window.winfo_screenheight()-height)/2
        self.window.geometry('%dx%d+%d+%d'%(width,height,left,top))
        self.window.resizable(0,0)
        self.create_widget()
        self.set_widget()
        self.place_widget()
        self.language='auto'
        self.window.mainloop()

    def create_widget(self):
        self.l1=ttk.Label(self.window)
        self.t1=Text(self.window)
        self.b1=ttk.Button(self.window)
        self.b2=ttk.Button(self.window)
        self.b3=ttk.Button(self.window)
        self.l2=ttk.Label(self.window)
        self.t2=Text(self.window)
        self.Scroll_vertical1 = Scrollbar(self.window, orient=VERTICAL)
        self.Scroll_vertical2 = Scrollbar(self.window, orient=VERTICAL)
        self.Scroll_level = Scrollbar(self.window, orient=HORIZONTAL)
        self.m=Menu(self.window)
        self.window['menu']=self.m
        self.l3=ttk.Label(self.window)


    def set_widget(self):
        self.l1.config(text='待翻译文本',font=('宋体',10))
        self.b1.config(text='清空输入框',command=lambda:self.thread_it(self.clear_t))
        self.b2.config(text='翻译',command=lambda:self.thread_it(self.do_translate))
        self.b3.config(text='复制翻译内容',command=lambda:self.thread_it(self.copy_t))
        self.l2.config(text='翻译结果',font=('宋体',10))
        self.Scroll_vertical1.config(command=self.t1.yview)
        self.t1['yscrollcommand'] = self.Scroll_vertical1.set
        self.Scroll_vertical2.config(command=self.t2.yview)
        self.t2['yscrollcommand'] = self.Scroll_vertical2.set
        self.t2['xscrollcommand']=self.Scroll_level.set
        self.s1=Menu(self.m,tearoff=False)
        self.s2=Menu(self.m,tearoff=False)
        self.s3=Menu(self.m,tearoff=False)
        self.m.add_cascade(label='文件',menu=self.s1)
        self.m.add_cascade(label='操作',menu=self.s2)
        self.m.add_cascade(label='关于',menu=self.s3)
        self.s1.add_command(label='打开文本文件',command=self.open_txt)
        self.s1.add_separator()
        self.s1.add_command(label='退出',command=self.quit_window)
        self.s2.add_command(label='翻译',command=lambda:self.thread_it(self.do_translate))
        self.s2.add_command(label='选择语言',command=self.open_topleval)
        self.s2.add_command(label='清空内容',command=self.clear_t)
        self.s2.add_command(label='复制结果',command=lambda:self.thread_it(self.copy_t))
        self.s3.add_command(label='说明',command=self.show_infos)
        self.l3_var=StringVar()
        self.l3.config(textvariable=self.l3_var,background='lightblue')
        self.l3_var.set('当前[自动选择]目标语言')
        self.window.bind('<Escape>',self.escape)
        self.t1.bind('<Return>',lambda:self.thread_it(self.do_translate))
        self.window.protocol('WM_DELETE_WINDOW',self.quit_window)
        self.menubar = Menu(self.t1,tearoff=False)
        self.menubar.add_command(label="粘贴", command=self.do_paste)
        self.t1.bind('<Button-3>',self.paste)
        self.menubar2 = Menu(self.t2,tearoff=False)
        self.menubar2.add_command(label="粘贴", command=self.do_paste2)
        self.t2.bind('<Button-3>',self.paste2)
        self.current_select=0

    def place_widget(self):
        self.l1.place(x=200,y=5)
        self.t1.place(x=10,y=30,height=150,width=450)
        self.Scroll_vertical1.place(x=445,y=30,height=150)
        self.b1.place(x=10,y=200)
        self.b2.place(x=180,y=200)
        self.b3.place(x=370,y=200)
        self.l2.place(x=200,y=228)
        self.t2.place(x=10,y=250,height=180,width=450)
        self.Scroll_vertical2.place(x=445,y=250,height=180)
        self.Scroll_level.place(x=10,y=430,width=450)
        self.l3.place(x=0,y=450,width=480,height=30)

    def open_topleval(self):
        self.select_lan_window=Toplevel()
        width=250
        height=50
        left=(self.select_lan_window.winfo_screenwidth()-width)/2
        top=(self.select_lan_window.winfo_screenheight()-height)/2
        self.select_lan_window.geometry('%dx%d+%d+%d'%(width,height,left,top))
        self.select_lan_window.resizable(0,0)
        self.s_combobox_var=StringVar()
        self.language_table=Do_Trans().get_language_table()
        self.s_combobox=ttk.Combobox(self.select_lan_window,textvariable=self.s_combobox_var,justify='center',state='readonly',width=17,value=[language['language'] for language in self.language_table])
        #对当前选中语言进行记录
        if self.current_select==0:
            self.s_combobox.current(0)
        else:
            self.s_combobox.current(self.current_select)
        self.s_b1=ttk.Button(self.select_lan_window,text='选择',command=self.select_lan)
        self.s_combobox.pack(side=LEFT)
        self.s_b1.pack(side=RIGHT)
        self.select_lan_window.mainloop()


    def select_lan(self):
        self.current_select=self.s_combobox.current()
        self.now_language=self.language_table[self.s_combobox.current()]['language']
        messagebox.showinfo('提示',f'当前选择 [{self.now_language}] 作为目标语言')
        self.l3_var.set(f'选择[{self.now_language}]作为目标语言')
        self.now_lan=self.language_table[self.s_combobox.current()]['short']
        self.select_lan_window.destroy()

    def open_txt(self):
        txt_path = askopenfilename(title='选择一个txt文本文件',filetypes=[('txt source file','*.txt')])
        if txt_path:
            self.t1.delete('0.0',END)
            with open(txt_path,'r',encoding='utf-8')as f:
                for line in f.readlines():
                    self.t1.insert(END,line)
            f.close()

    def paste(self,event):
        self.menubar.post(event.x_root,event.y_root)


    def do_paste(self):
        self.t1.insert(END,pyperclip.paste())

    def paste2(self,event):
        self.menubar2.post(event.x_root,event.y_root)


    def do_paste2(self):
        self.t2.insert(END,pyperclip.paste())

    def escape(self,event):
        self.quit_window()

    def quit_window(self):
        ret=messagebox.askyesno('退出','是否要退出?')
        if ret:
            self.window.destroy()

    def do_translate(self):
        try:
            self.aim_language=self.now_lan
        except AttributeError:
            self.aim_language= self.language
        self.t2.delete('0.0',END)
        text=self.t1.get('0.0',END)
        if len(text)!=1:
            self.l3_var.set('正在翻译...')
            t=Do_Trans()
            result=t.translate(text,self.aim_language)
            if result:
                self.l3.config(background='lightblue')
                self.t2.insert(END,result.strip())
                try:
                    self.l3_var.set(f'翻译完成...已翻译为[{self.now_language}]')
                except AttributeError:
                    self.l3_var.set(f'翻译完成...已[自动选择目标语言]')

            else:
                self.l3_var.set('翻译失败,请检查网络!')
                self.l3.config(background='red')
        else:
            messagebox.showwarning('警告','请输入内容!')
            self.l3.config(background='red')
            self.l3_var.set('请输入内容')

    def clear_t(self):
        self.t1.delete('0.0',END)
        self.t2.delete('0.0',END)

    def copy_t(self):
        tr_res=self.t2.get('0.0',END)
        pyperclip.copy(tr_res)
        spam = pyperclip.paste()
        if spam:
            self.l3.config(background='lightyellow')
            self.l3_var.set('复制成功!')

    def show_infos(self):
        messagebox.showinfo('说明','作者:??Vメ')

    def thread_it(self,func,*args):
        t=threading.Thread(target=func,args=args)
        t.setDaemon(True)
        t.start()

if __name__ == '__main__':
    a=App()

3.2 Translator.py

from google_trans_new import google_translator
import re

class Do_Trans():

    def get_language_table(self,):
        lan_table1 = lan_table.strip().replace("'", '')
        names = re.findall(r'[\u4e00-\u9fa5()]+', lan_table1)
        lans = re.findall(r'[^\u4e00-\u9fa5 \s:()]+', lan_table1)
        language_table = []
        for language in zip(names, lans):
            item = {}
            item['language'] = language[0]
            item['short'] = language[1]
            language_table.append(item)
        return language_table

    def translate(self,text,language):
        try:
            t=google_translator().translate(text,language)
            return t
        except:
            return False
lan_table='''
'自动选择': 'auto'
'南非荷兰语': 'af'
'阿尔巴尼亚语': 'sq'
'阿姆哈拉语': 'am'
'阿拉伯语': 'ar'
'亚美尼亚语': 'hy'
'阿塞拜疆语': 'az'
'巴斯克语': 'eu'
'白俄罗斯语': 'be'
'孟加拉语': 'bn'
'波斯尼亚语': 'bs'
'保加利亚语': 'bg'
'加泰罗尼亚语': 'ca'
'宿务语': 'ceb'
'中文(简体)': 'zh'
'中文(繁体)': 'zh-TW'
'科西嘉语': 'co'
'克罗地亚语': 'hr'
'捷克语': 'cs'
'丹麦语': 'da'
'荷兰语': 'nl'
'英语': 'en'
'世界语': 'eo'
'爱沙尼亚语': 'et'
'芬兰语': 'fi'
'法语': 'fr'
'弗里西语': 'fy'
'加利西亚语': 'gl'
'格鲁吉亚语': 'ka'
'德语': 'de'
'希腊语': 'el'
'古吉拉特语': 'gu'
'海地克里奥尔语': 'ht'
'豪萨语': 'ha'
'夏威夷语': 'haw'
'希伯来语': 'he'
'印地语': 'hi'
'苗语': 'hmn'
'匈牙利语': 'hu'
'冰岛语': 'is'
'伊博语': 'ig'
'印尼语': 'id'
'爱尔兰语': 'ga'
'意大利语': 'it'
'日语': 'ja'
'爪哇语': 'jw'
'卡纳达语': 'kn'
'哈萨克语': 'kk'
'高棉语': 'km'
'韩语': 'ko'
'库尔德语': 'ku'
'吉尔吉斯语': 'ky'
'老挝语': 'lo'
'拉丁语': 'la'
'拉脱维亚语': 'lv'
'立陶宛语': 'lt'
'卢森堡语': 'lb'
'马其顿语': 'mk'
'马尔加什语': 'mg'
'马来语': 'ms'
'马拉雅拉姆语': 'ml'
'马耳他语': 'mt'
'毛利语': 'mi'
'马拉地语': 'mr'
'蒙古语': 'mn'
'缅甸语': 'my'
'尼泊尔语': 'ne'
'挪威语': 'no'
'尼杨扎语(齐切瓦语)': 'ny'
'普什图语': 'ps'
'波斯语': 'fa'
'波兰语': 'pl'
'葡萄牙语': 'pt'
'旁遮普语': 'pa'
'罗马尼亚语': 'ro'
'俄语': 'ru'
'萨摩亚语': 'sm'
'苏格兰盖尔语': 'gd'
'塞尔维亚语': 'sr'
'塞索托语': 'st'
'修纳语': 'sn'
'信德语': 'sd'
'僧伽罗语': 'si'
'斯洛伐克语': 'sk'
'斯洛文尼亚语': 'sl'
'索马里语': 'so'
'西班牙语': 'es'
'巽他语': 'su'
'斯瓦希里语': 'sw'
'瑞典语': 'sv'
'塔加洛语(菲律宾语)': 'tl'
'塔吉克语': 'tg'
'泰米尔语': 'ta'
'泰卢固语': 'te'
'泰语': 'th'
'土耳其语': 'tr'
'乌克兰语': 'uk'
'乌尔都语': 'ur'
'乌兹别克语': 'uz'
'越南语': 'vi'
'威尔士语': 'cy'
'班图语': 'xh'
'意第绪语': 'yi'
'约鲁巴语': 'yo'
'祖鲁语': 'zu'
'南非荷兰语': 'af'
'阿尔巴尼亚语': 'sq'
'阿姆哈拉语': 'am'
'阿拉伯语': 'ar'
'亚美尼亚语': 'hy'
'阿塞拜疆语': 'az'
'巴斯克语': 'eu'
'白俄罗斯语': 'be'
'孟加拉语': 'bn'
'波斯尼亚语': 'bs'
'保加利亚语': 'bg'
'加泰罗尼亚语': 'ca'
'宿务语': 'ceb'
'中文(简体)': 'zh'
'中文(繁体)': 'zh-TW'
'科西嘉语': 'co'
'克罗地亚语': 'hr'
'捷克语': 'cs'
'丹麦语': 'da'
'荷兰语': 'nl'
'英语': 'en'
'世界语': 'eo'
'爱沙尼亚语': 'et'
'芬兰语': 'fi'
'法语': 'fr'
'弗里西语': 'fy'
'加利西亚语': 'gl'
'格鲁吉亚语': 'ka'
'德语': 'de'
'希腊语': 'el'
'古吉拉特语': 'gu'
'海地克里奥尔语': 'ht'
'豪萨语': 'ha'
'夏威夷语': 'haw'
'希伯来语': 'he'
'印地语': 'hi'
'苗语': 'hmn'
'匈牙利语': 'hu'
'冰岛语': 'is'
'伊博语': 'ig'
'印尼语': 'id'
'爱尔兰语': 'ga'
'意大利语': 'it'
'日语': 'ja'
'爪哇语': 'jw'
'卡纳达语': 'kn'
'哈萨克语': 'kk'
'高棉语': 'km'
'韩语': 'ko'
'库尔德语': 'ku'
'吉尔吉斯语': 'ky'
'老挝语': 'lo'
'拉丁语': 'la'
'拉脱维亚语': 'lv'
'立陶宛语': 'lt'
'卢森堡语': 'lb'
'马其顿语': 'mk'
'马尔加什语': 'mg'
'马来语': 'ms'
'马拉雅拉姆语': 'ml'
'马耳他语': 'mt'
'毛利语': 'mi'
'马拉地语': 'mr'
'蒙古语': 'mn'
'缅甸语': 'my'
'尼泊尔语': 'ne'
'挪威语': 'no'
'尼杨扎语(齐切瓦语)': 'ny'
'普什图语': 'ps'
'波斯语': 'fa'
'波兰语': 'pl'
'葡萄牙语': 'pt'
'旁遮普语': 'pa'
'罗马尼亚语': 'ro'
'俄语': 'ru'
'萨摩亚语': 'sm'
'苏格兰盖尔语': 'gd'
'塞尔维亚语': 'sr'
'塞索托语': 'st'
'修纳语': 'sn'
'信德语': 'sd'
'僧伽罗语': 'si'
'斯洛伐克语': 'sk'
'斯洛文尼亚语': 'sl'
'索马里语': 'so'
'西班牙语': 'es'
'巽他语': 'su'
'斯瓦希里语': 'sw'
'瑞典语': 'sv'
'塔加洛语(菲律宾语)': 'tl'
'塔吉克语': 'tg'
'泰米尔语': 'ta'
'泰卢固语': 'te'
'泰语': 'th'
'土耳其语': 'tr'
'乌克兰语': 'uk'
'乌尔都语': 'ur'
'乌兹别克语': 'uz'
'越南语': 'vi'
'威尔士语': 'cy'
'班图语': 'xh'
'意第绪语': 'yi'
'约鲁巴语': 'yo'
'祖鲁语': 'zu'
'''

四.总结

本次依然使用Tkinter做了一款翻译器,但无论是界面还是功能都在上一版有了很大改进
1.支持txt文本文件导入翻译
2.使用Combobox记录当前目标语言
3.调用谷歌翻译接口,翻译准确
4.自动识别源语言类型
5.加入鼠标右键事件,粘贴更方便
GUI打包好放在了蓝奏云,欢迎各位交流讨论。

以上就是python 制作一个gui的翻译工具的详细内容,更多关于python gui翻译工具的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
Python中操作符重载用法分析
Apr 29 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
django项目搭建与Session使用详解
Oct 10 Python
解决pandas .to_excel不覆盖已有sheet的问题
Dec 10 Python
python从子线程中获得返回值的方法
Jan 30 Python
python使用 zip 同时迭代多个序列示例
Jul 06 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
Python新手学习raise用法
Jun 03 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
python3中apply函数和lambda函数的使用详解
Feb 28 Python
pyqt5打包成exe可执行文件的方法
Python 机器学习工具包SKlearn的安装与使用
python process模块的使用简介
May 14 #Python
django学习之ajax post传参的2种格式实例
May 14 #Python
Python djanjo之csrf防跨站攻击实验过程
python控制台打印log输出重复的解决方法
聊一聊python常用的编程模块
May 14 #Python
You might like
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
阿里云ecs服务器中安装部署node.js的步骤
2016/10/08 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
Python中zfill()方法的使用教程
2015/05/20 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Python中@property的理解和使用示例
2019/06/11 Python
Django实现跨域的2种方法
2019/07/31 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
四好少年事迹材料
2014/01/12 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
实习评语大全
2014/04/26 职场文书
个人简历自荐信
2014/06/26 职场文书
vue实现滑动解锁功能
2022/03/03 Vue.js
SQL Server中锁的用法
2022/05/20 SQL Server