python3GUI--翻译器-v2.0(附源码)

本文阅读 6 分钟
首页 安全分享,WEB安全 正文

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

pip install google_trans_new

安装一下。

1.主界面

img

2.翻译

img

3.支持多种语言哦

img

设计流程很简单,这里就直接贴代码了 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打包好放在了 蓝奏云,欢迎各位交流讨论。 思路、代码方面有什么不足欢迎各位大佬指正、批评!img

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/a1397852386/article/details/116303283
-- 展开阅读全文 --
BUUCTF Web [极客大挑战 2019]Knife
« 上一篇 06-24
安全面试之XSS(跨站脚本攻击)
下一篇 » 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复