文章目录

  • 一.准备工作
  • 二.预览
    • 1.主界面
    • 2.翻译
    • 3.支持多种语言哦
  • 三.源代码
  • 四.总结

有一个月没发博客了,上次用Tk做了一个翻译器,界面比较粗糙,翻译语言限定为汉语,文本仅支持手动粘贴,遂在此基础上加以改进,发布翻译器2.0版本,认真看完,代码将放在蓝奏云。

一.准备工作

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

pip install google_trans_new

安装一下。

二.预览

1.主界面

2.翻译

3.支持多种语言哦

三.源代码

设计流程很简单,这里就直接贴代码了
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=480height=480left=(self.window.winfo_screenwidth()-width)/2top=(self.window.winfo_screenheight()-height)/2self.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.mself.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.setself.Scroll_vertical2.config(command=self.t2.yview)self.t2['yscrollcommand'] = self.Scroll_vertical2.setself.t2['xscrollcommand']=self.Scroll_level.setself.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=0def 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=250height=50left=(self.select_lan_window.winfo_screenwidth()-width)/2top=(self.select_lan_window.winfo_screenheight()-height)/2self.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_lanexcept AttributeError:self.aim_language= self.languageself.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('说明','作者:懷淰メ')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 reclass 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_tabledef translate(self,text,language):try:t=google_translator().translate(text,language)return texcept: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打包好放在了蓝奏云,欢迎各位交流讨论。
思路、代码方面有什么不足欢迎各位大佬指正、批评!

python3GUI--翻译器-v2.0(附源码)相关推荐

  1. android网络编程终结者,小七论坛终结者V2.0升级版源码 - 源码下载|Internet/网络编程|远程控制编程|源代码 - 源码中国...

    文件名大小更新时间 小七论坛终结者V2.0升级版源码\Bin\Assist.dll409602018-05-16 小七论坛终结者V2.0升级版源码\Bin\bk.gif12232018-05-16 小 ...

  2. SpringBoot多人社区项目2.0(附源码和SQL)

    目录 1.前言 2.软件架构及Maven的pom依赖 3.项目效果图展示 1.游客页面 2.用户页面 3.简单适配手机端 4.项目总结 5.项目网址及源码地址 1.前言 记得在刚学完SSM的时候做了第 ...

  3. 印记博客IBO博客系统 v2.0.2源码

    简介: IBO博客系统是一个基于 SpringBoot/MongoDB 的博客系统.IBO形容的是印记:印记博客.想必大家都希望自己的博客记录自己所想,留有所念,留下胜过的印记. 博客特性: 支持Ma ...

  4. 轻量小巧的Knife4j v2.0.8源码

    介绍: Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能 ...

  5. Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决

    Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决 参考文章: (1)Ubuntu12.04编译Android ...

  6. Spark 3.0 发布了,代码拉过来,打个包,跑起来!| 附源码编译

    作者 | 敏叔V587 责编 | 徐威龙 封图| CSDN 下载于视觉中国 Spark3.0已经发布有一阵子了,官方发布了预览版,带来了一大波更新,对于我们程序员来说,首先当然是代码拉过来,打个包,跑 ...

  7. 360影视php视频系统源码,全新360影视2.0完整源码 双端APP+三级分销 附视频搭建教程...

    源码资源说明: 演示环境Linux+mysql+PHP5.6+伪静态支持这个程序基本环境要求不是很大,但有的地方还是要注意一下说一下需要的东西: 1.主机 2.域名 3.源码(会给大家打包,包含前后端 ...

  8. vc++6.0:MFC写的一个汉字取模软件(附源码)

    vc++6.0:MFC写的一个汉字取模软件(附源码) 一.毕业有九年了,突然想起以前在大学时候用MFC写的一个汉字取模软件.主要的功能是在PC上获取汉字16X16点阵数据然后通过串口把点阵数据发送给A ...

  9. 代练工作室php源码,PHP开发的代练系统V2.0版本源码 附带搭建和对接支付视频

    PHP开发的代练系统V2.0版本源码 附带搭建和对接支付视频 1/ 修改DB数据库MYSQL连接配置文件 /Public_Menglenet/A/Common/Conf/Config.php 内的数据 ...

最新文章

  1. NVIDIA 认证系统
  2. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例
  3. JVM---执行引擎
  4. 2020年港澳台电视直播软件_中山大学2020年港澳台侨联考各专业录取分数线
  5. numpy meshgrid 和 mgrid 的两个简单实例和解析
  6. win32 GDI 画图 防止闪烁
  7. SpringBoot 2.x 监控中心:Admin
  8. qt中Qtableview的用法
  9. Python项目可以有多大?最多可以有多少行代码?
  10. 减少主要GC暂停的频率
  11. toj 4609 Internal Rate of Return
  12. 【华为大咖分享】5.交付在云端-全云DevOps研发实践(后附PPT下载地址)
  13. Hegic Q1报告:TVL接近6000万美元,日交易量达2200万美元创新高
  14. 《微信背后的产品观》一书
  15. 实验一计算机网络基础知识,计算机网络实验基础知识 集线器的使用
  16. 软件测试人员的年终绩效考核怎么应对
  17. linux环境下mysql主从数据库配置(maser-slave-replication)
  18. 物联网设备数据流转之数据如何存储:TDengine集成SpringBoot, MyBatisPlus实现ORM与CRUD
  19. 2021年十大数据分析和商业智能趋势
  20. 什么是WordPress

热门文章

  1. C语言高级部分总结,也是面试官会经常问的问题哦~
  2. 游戏开发适合什么语言?
  3. 苹果m1可以虚拟服务器,苹果M1芯片可以运行ARM版win10 但需要利用虚拟机
  4. 中央电大计算机网络试题,2017电大统考计算机试题及答案
  5. c语言 运行出现错误代码,运行出现 debug error
  6. PS 学习笔记 03-移动工具图层概念
  7. Android实现截屏和截长图功能的几种方法
  8. 教程:这两个小妙招手把手教会你白底图片怎么抠图
  9. 海外众筹:产品出海kickstarter海外众筹流程
  10. [集合竞价-AI量化]天天做超短,集合竞价的盘口语言你真的读懂了麽?