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

2021-07-01 0 402

一.准备工作

除了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 python 制作一个gui界面的翻译工具 http://www.ox520.com/28794.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务