App下載

怎么用python制作一個(gè)gui界面的翻譯工具?

花式作死冠軍 2021-08-10 17:56:48 瀏覽數(shù) (3373)
反饋

小伙伴們?nèi)粘I钪惺褂玫姆g軟件都有哪些呢?有道,百度,金山,這些翻譯軟件或多或少夾雜著一些我們不需要的功能,今天我們來(lái)介紹python制作GUI界面的翻譯工具,使用到了python翻譯工具庫(kù)為Google_trans_new來(lái)提供翻譯功能,是個(gè)不錯(cuò)的GUI界面編程練手項(xiàng)目,小伙伴們趕快學(xué)起來(lái)吧。

一.準(zhǔn)備工作

除了Tkinter,還需要google_trans_new,沒(méi)有安裝這個(gè)庫(kù)的朋友,可以使用

pip install google_trans_new

安裝一下。

二.預(yù)覽

1.主界面

主頁(yè)面

2.翻譯

翻譯功能

3.支持多種語(yǔ)言哦

支持多種語(yǔ)言

三.源代碼

設(shè)計(jì)流程很簡(jiǎn)單,這里就直接貼代碼了

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進(jìn)行語(yǔ)言記錄
"""

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='復(fù)制翻譯內(nèi)容',command=lambda:self.thread_it(self.copy_t))
        self.l2.config(text='翻譯結(jié)果',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='關(guān)于',menu=self.s3)
        self.s1.add_command(label='打開(kāi)文本文件',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='選擇語(yǔ)言',command=self.open_topleval)
        self.s2.add_command(label='清空內(nèi)容',command=self.clear_t)
        self.s2.add_command(label='復(fù)制結(jié)果',command=lambda:self.thread_it(self.copy_t))
        self.s3.add_command(label='說(shuō)明',command=self.show_infos)
        self.l3_var=StringVar()
        self.l3.config(textvariable=self.l3_var,background='lightblue')
        self.l3_var.set('當(dāng)前[自動(dòng)選擇]目標(biāo)語(yǔ)言')
        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])
        #對(duì)當(dāng)前選中語(yǔ)言進(jìn)行記錄
        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'當(dāng)前選擇 [{self.now_language}] 作為目標(biāo)語(yǔ)言')
        self.l3_var.set(f'選擇[{self.now_language}]作為目標(biāo)語(yǔ)言')
        self.now_lan=self.language_table[self.s_combobox.current()]['short']
        self.select_lan_window.destroy()

    def open_txt(self):
        txt_path = askopenfilename(title='選擇一個(gè)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'翻譯完成...已[自動(dòng)選擇目標(biāo)語(yǔ)言]')

            else:
                self.l3_var.set('翻譯失敗,請(qǐng)檢查網(wǎng)絡(luò)!')
                self.l3.config(background='red')
        else:
            messagebox.showwarning('警告','請(qǐng)輸入內(nèi)容!')
            self.l3.config(background='red')
            self.l3_var.set('請(qǐng)輸入內(nèi)容')

    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('復(fù)制成功!')

    def show_infos(self):
        messagebox.showinfo('說(shuō)明','作者:懷淰メ')

    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='''
'自動(dòng)選擇': 'auto'
'南非荷蘭語(yǔ)': 'af'
'阿爾巴尼亞語(yǔ)': 'sq'
'阿姆哈拉語(yǔ)': 'am'
'阿拉伯語(yǔ)': 'ar'
'亞美尼亞語(yǔ)': 'hy'
'阿塞拜疆語(yǔ)': 'az'
'巴斯克語(yǔ)': 'eu'
'白俄羅斯語(yǔ)': 'be'
'孟加拉語(yǔ)': 'bn'
'波斯尼亞語(yǔ)': 'bs'
'保加利亞語(yǔ)': 'bg'
'加泰羅尼亞語(yǔ)': 'ca'
'宿務(wù)語(yǔ)': 'ceb'
'中文(簡(jiǎn)體)': 'zh'
'中文(繁體)': 'zh-TW'
'科西嘉語(yǔ)': 'co'
'克羅地亞語(yǔ)': 'hr'
'捷克語(yǔ)': 'cs'
'丹麥語(yǔ)': 'da'
'荷蘭語(yǔ)': 'nl'
'英語(yǔ)': 'en'
'世界語(yǔ)': 'eo'
'愛(ài)沙尼亞語(yǔ)': 'et'
'芬蘭語(yǔ)': 'fi'
'法語(yǔ)': 'fr'
'弗里西語(yǔ)': 'fy'
'加利西亞語(yǔ)': 'gl'
'格魯吉亞語(yǔ)': 'ka'
'德語(yǔ)': 'de'
'希臘語(yǔ)': 'el'
'古吉拉特語(yǔ)': 'gu'
'海地克里奧爾語(yǔ)': 'ht'
'豪薩語(yǔ)': 'ha'
'夏威夷語(yǔ)': 'haw'
'希伯來(lái)語(yǔ)': 'he'
'印地語(yǔ)': 'hi'
'苗語(yǔ)': 'hmn'
'匈牙利語(yǔ)': 'hu'
'冰島語(yǔ)': 'is'
'伊博語(yǔ)': 'ig'
'印尼語(yǔ)': 'id'
'愛(ài)爾蘭語(yǔ)': 'ga'
'意大利語(yǔ)': 'it'
'日語(yǔ)': 'ja'
'爪哇語(yǔ)': 'jw'
'卡納達(dá)語(yǔ)': 'kn'
'哈薩克語(yǔ)': 'kk'
'高棉語(yǔ)': 'km'
'韓語(yǔ)': 'ko'
'庫(kù)爾德語(yǔ)': 'ku'
'吉爾吉斯語(yǔ)': 'ky'
'老撾語(yǔ)': 'lo'
'拉丁語(yǔ)': 'la'
'拉脫維亞語(yǔ)': 'lv'
'立陶宛語(yǔ)': 'lt'
'盧森堡語(yǔ)': 'lb'
'馬其頓語(yǔ)': 'mk'
'馬爾加什語(yǔ)': 'mg'
'馬來(lái)語(yǔ)': 'ms'
'馬拉雅拉姆語(yǔ)': 'ml'
'馬耳他語(yǔ)': 'mt'
'毛利語(yǔ)': 'mi'
'馬拉地語(yǔ)': 'mr'
'蒙古語(yǔ)': 'mn'
'緬甸語(yǔ)': 'my'
'尼泊爾語(yǔ)': 'ne'
'挪威語(yǔ)': 'no'
'尼楊扎語(yǔ)(齊切瓦語(yǔ))': 'ny'
'普什圖語(yǔ)': 'ps'
'波斯語(yǔ)': 'fa'
'波蘭語(yǔ)': 'pl'
'葡萄牙語(yǔ)': 'pt'
'旁遮普語(yǔ)': 'pa'
'羅馬尼亞語(yǔ)': 'ro'
'俄語(yǔ)': 'ru'
'薩摩亞語(yǔ)': 'sm'
'蘇格蘭蓋爾語(yǔ)': 'gd'
'塞爾維亞語(yǔ)': 'sr'
'塞索托語(yǔ)': 'st'
'修納語(yǔ)': 'sn'
'信德語(yǔ)': 'sd'
'僧伽羅語(yǔ)': 'si'
'斯洛伐克語(yǔ)': 'sk'
'斯洛文尼亞語(yǔ)': 'sl'
'索馬里語(yǔ)': 'so'
'西班牙語(yǔ)': 'es'
'巽他語(yǔ)': 'su'
'斯瓦希里語(yǔ)': 'sw'
'瑞典語(yǔ)': 'sv'
'塔加洛語(yǔ)(菲律賓語(yǔ))': 'tl'
'塔吉克語(yǔ)': 'tg'
'泰米爾語(yǔ)': 'ta'
'泰盧固語(yǔ)': 'te'
'泰語(yǔ)': 'th'
'土耳其語(yǔ)': 'tr'
'烏克蘭語(yǔ)': 'uk'
'烏爾都語(yǔ)': 'ur'
'烏茲別克語(yǔ)': 'uz'
'越南語(yǔ)': 'vi'
'威爾士語(yǔ)': 'cy'
'班圖語(yǔ)': 'xh'
'意第緒語(yǔ)': 'yi'
'約魯巴語(yǔ)': 'yo'
'祖魯語(yǔ)': 'zu'
'南非荷蘭語(yǔ)': 'af'
'阿爾巴尼亞語(yǔ)': 'sq'
'阿姆哈拉語(yǔ)': 'am'
'阿拉伯語(yǔ)': 'ar'
'亞美尼亞語(yǔ)': 'hy'
'阿塞拜疆語(yǔ)': 'az'
'巴斯克語(yǔ)': 'eu'
'白俄羅斯語(yǔ)': 'be'
'孟加拉語(yǔ)': 'bn'
'波斯尼亞語(yǔ)': 'bs'
'保加利亞語(yǔ)': 'bg'
'加泰羅尼亞語(yǔ)': 'ca'
'宿務(wù)語(yǔ)': 'ceb'
'中文(簡(jiǎn)體)': 'zh'
'中文(繁體)': 'zh-TW'
'科西嘉語(yǔ)': 'co'
'克羅地亞語(yǔ)': 'hr'
'捷克語(yǔ)': 'cs'
'丹麥語(yǔ)': 'da'
'荷蘭語(yǔ)': 'nl'
'英語(yǔ)': 'en'
'世界語(yǔ)': 'eo'
'愛(ài)沙尼亞語(yǔ)': 'et'
'芬蘭語(yǔ)': 'fi'
'法語(yǔ)': 'fr'
'弗里西語(yǔ)': 'fy'
'加利西亞語(yǔ)': 'gl'
'格魯吉亞語(yǔ)': 'ka'
'德語(yǔ)': 'de'
'希臘語(yǔ)': 'el'
'古吉拉特語(yǔ)': 'gu'
'海地克里奧爾語(yǔ)': 'ht'
'豪薩語(yǔ)': 'ha'
'夏威夷語(yǔ)': 'haw'
'希伯來(lái)語(yǔ)': 'he'
'印地語(yǔ)': 'hi'
'苗語(yǔ)': 'hmn'
'匈牙利語(yǔ)': 'hu'
'冰島語(yǔ)': 'is'
'伊博語(yǔ)': 'ig'
'印尼語(yǔ)': 'id'
'愛(ài)爾蘭語(yǔ)': 'ga'
'意大利語(yǔ)': 'it'
'日語(yǔ)': 'ja'
'爪哇語(yǔ)': 'jw'
'卡納達(dá)語(yǔ)': 'kn'
'哈薩克語(yǔ)': 'kk'
'高棉語(yǔ)': 'km'
'韓語(yǔ)': 'ko'
'庫(kù)爾德語(yǔ)': 'ku'
'吉爾吉斯語(yǔ)': 'ky'
'老撾語(yǔ)': 'lo'
'拉丁語(yǔ)': 'la'
'拉脫維亞語(yǔ)': 'lv'
'立陶宛語(yǔ)': 'lt'
'盧森堡語(yǔ)': 'lb'
'馬其頓語(yǔ)': 'mk'
'馬爾加什語(yǔ)': 'mg'
'馬來(lái)語(yǔ)': 'ms'
'馬拉雅拉姆語(yǔ)': 'ml'
'馬耳他語(yǔ)': 'mt'
'毛利語(yǔ)': 'mi'
'馬拉地語(yǔ)': 'mr'
'蒙古語(yǔ)': 'mn'
'緬甸語(yǔ)': 'my'
'尼泊爾語(yǔ)': 'ne'
'挪威語(yǔ)': 'no'
'尼楊扎語(yǔ)(齊切瓦語(yǔ))': 'ny'
'普什圖語(yǔ)': 'ps'
'波斯語(yǔ)': 'fa'
'波蘭語(yǔ)': 'pl'
'葡萄牙語(yǔ)': 'pt'
'旁遮普語(yǔ)': 'pa'
'羅馬尼亞語(yǔ)': 'ro'
'俄語(yǔ)': 'ru'
'薩摩亞語(yǔ)': 'sm'
'蘇格蘭蓋爾語(yǔ)': 'gd'
'塞爾維亞語(yǔ)': 'sr'
'塞索托語(yǔ)': 'st'
'修納語(yǔ)': 'sn'
'信德語(yǔ)': 'sd'
'僧伽羅語(yǔ)': 'si'
'斯洛伐克語(yǔ)': 'sk'
'斯洛文尼亞語(yǔ)': 'sl'
'索馬里語(yǔ)': 'so'
'西班牙語(yǔ)': 'es'
'巽他語(yǔ)': 'su'
'斯瓦希里語(yǔ)': 'sw'
'瑞典語(yǔ)': 'sv'
'塔加洛語(yǔ)(菲律賓語(yǔ))': 'tl'
'塔吉克語(yǔ)': 'tg'
'泰米爾語(yǔ)': 'ta'
'泰盧固語(yǔ)': 'te'
'泰語(yǔ)': 'th'
'土耳其語(yǔ)': 'tr'
'烏克蘭語(yǔ)': 'uk'
'烏爾都語(yǔ)': 'ur'
'烏茲別克語(yǔ)': 'uz'
'越南語(yǔ)': 'vi'
'威爾士語(yǔ)': 'cy'
'班圖語(yǔ)': 'xh'
'意第緒語(yǔ)': 'yi'
'約魯巴語(yǔ)': 'yo'
'祖魯語(yǔ)': 'zu'
'''

四.總結(jié)

本次依然使用Tkinter做了一款翻譯器,但無(wú)論是界面還是功能都在上一版有了很大改進(jìn)
1.支持txt文本文件導(dǎo)入翻譯
2.使用Combobox記錄當(dāng)前目標(biāo)語(yǔ)言
3.調(diào)用谷歌翻譯接口,翻譯準(zhǔn)確
4.自動(dòng)識(shí)別源語(yǔ)言類型
5.加入鼠標(biāo)右鍵事件,粘貼更方便
GUI打包好放在了藍(lán)奏云,歡迎各位交流討論。


以上就是python制作GUI界面的翻譯工具的詳細(xì)內(nèi)容,更多python界面編程的學(xué)習(xí)資料請(qǐng)關(guān)注W3Cschool其它相關(guān)文章!


0 人點(diǎn)贊