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

编辑: admin 分类: python 发布时间: 2021-12-24 来源:互联网
目录
  • 一.准备工作
  • 二.预览
    • 1.主界面
    • 2.翻译
    • 3.支持多种语言哦
  • 三.源代码
    • 3.1 My_Translator-v2.0.py
    • 3.2 Translator.py
  • 四.总结

    一.准备工作

    除了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=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('说明','作者:懷淰メ')
    
        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翻译工具的资料请关注hwidc其它相关文章!