Python GUI:Tkinter —— 08

歷史文章導航

Tkinter 基本教程

Tkinter GUI 01
Tkinter GUI 02
Tkinter GUI 03
Tkinter GUI 04
Tkinter GUI 05
Tkinter GUI 06
Tkinter GUI 07
Tkinter GUI 08

Word轉手寫體軟件開發

教程1
教程2
軟件使用指南與源碼

國際化

來談談國際化吧,所謂國際化,就是將自己的程序,能過在菜單欄(或是其他地方),切換成其他語言

新的開始

文件準備

由於斷更了一下,我們拋棄前面章節的代碼,重新寫一個新的GUI:首先創建一個項目文件:
創建一個PyDev項目
然後在項目文件中,新建一個 GUI 文件夾,並在下面添加一個 Tab1.py ,Tab2.py。再在項目文件夾下,添加一個 app.ico 圖片,文件工作就算完畢了。

新建GUI

首先,打開 Tab1.py ,輸入如下代碼:

# coding: utf-8
import tkinter as tk
from tkinter import ttk
from sys import exit
from tkinter import scrolledtext
from tkinter import Menu
from Tab2 import *
class OOP:
    def __init__(self):
        self.win = tk.Tk()
        self.win.resizable(0,0)    #這個是設置窗口不可縮放
        self._createWidget()
        
    def _quit():    #設置一個 menu 菜單項的激活函數
        win.quit()    #退出
        win.destroy()   #銷燬
        exit()   #結束程序
    def _chi(self):
        pass
    def _jap(self):
        pass
    def _eng(self):
        pass
    def _getIptFileName(self):
        pass
    def _getOptFileName(self):
        pass
    def _screenShot(self):
        pass
    def _trans(self):
        pass
    def _flag(self):
        pass
    
    def _createWidget(self):
        self.menuBar = Menu(self.win)
        self.win.configure(menu=self.menuBar)
        self.win.title('百變小T')
        self.win.iconbitmap(r'../app.ico')
        self.startMenu = Menu(self.menuBar,tearoff=0)
        # pop menus:
        self.I18NMenu = Menu(self.startMenu,tearoff=0)    # 這個是 Menu 中的 Menu 了,可以一直這樣嵌套下去
        self.I18NMenu.add_command(label='中文',command=self._chi)
        self.I18NMenu.add_command(label='日文',command=self._jap)
        self.I18NMenu.add_command(label='英文',command=self._eng)
        self.startMenu.add_cascade(label='語言切換',menu=self.I18NMenu)
        
        
        self.startMenu.add_command(label='退出',command=self._quit)
        self.menuBar.add_cascade(label='開始',menu=self.startMenu)
        
        self.tabControl = ttk.Notebook(self.win)
        self.tab1 = ttk.Frame(self.tabControl)
        self.tab2 = ttk.Frame(self.tabControl)
        self.tabControl.add(self.tab1,text='圖像轉文字')
        self.tabControl.add(self.tab2,text='PDF轉Word')
        self.tabControl.pack(fill='both',expand=1)
        
        self.zhuo = ttk.Frame(self.tab1)
        self.zhuo.grid(column=0,row=0)
        
        # 文件管理欄目
        self.inOutFrm = ttk.Frame(self.zhuo)
        self.inOutFrm.grid(column=0,row=0,sticky='W')
        
        self.inBut = ttk.Button(self.inOutFrm,text='輸入圖片',
                            command=self._getIptFileName)
        self.inBut.grid(column=0,row=0)
        self.inEry = ttk.Entry(self.inOutFrm,width=60)
        self.inEry.grid(column=1,row=0)
        
        self.outBut = ttk.Button(self.inOutFrm,text='輸出到',
                                 command=self._getOptFileName)
        self.outBut.grid(column=0,row=1)
        self.outEry = ttk.Entry(self.inOutFrm,width=60)
        self.outEry.grid(column=1,row=1)
        
        for child in self.inOutFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')
        
        #截圖與轉換按鈕
        self.butFrm = ttk.Frame(self.zhuo)
        self.butFrm.grid(column=0,row=1,sticky='W',pady=6)
        self.printScrBut = ttk.Button(self.butFrm,text='截圖',
                                   command=self._screenShot)
        self.printScrBut.grid(column=0,row=0)
        self.transBut = ttk.Button(self.butFrm,text='轉換',
                                   command=self._trans)
        self.transBut.grid(column=1,row=0)
        self.iptBut = ttk.Button(self.butFrm,text='直接從截圖中輸入',
                                   command=self._flag)
        self.iptBut.grid(column=2,row=0)
        
        for child in self.butFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')
        
        
        #滑動文字展示欄
        self.printOptFrm = ttk.LabelFrame(self.zhuo,text='文字輸出')
        self.printOptFrm.grid(row=2,column=0,sticky='W')
        self.scrTxt = scrolledtext.ScrolledText(self.printOptFrm,height=20,width=70,wrap=tk.WORD)
        self.scrTxt.grid(row=0,column=0,sticky='W',padx=6,pady=6)
        
        self.tab2Widget = Tab2(self.tab2)
oop = OOP()
oop.win.mainloop()       

基本架構

在這裏插入圖片描述

效果展示

在這裏插入圖片描述

Tab2.py

在 Tab2.py 文件中,輸入如下代碼:

# coding: utf-8
import tkinter as tk
from tkinter import ttk
import tkinter as tk
from tkinter import ttk

from PIL import ImageTk,Image
class Tab2():
    def __init__(self,tab):
        self._createWidget(tab)
    def _getIptFileName(self):
        pass
    def _getOptFileName(self):
        pass
    def _trans(self):
        pass
        
    def _createWidget(self,tab):
        self.zhuo = ttk.Frame(tab)
        self.zhuo.grid(row=0,column=0)
                # 文件管理欄目
        self.inOutFrm = ttk.Frame(self.zhuo)
        self.inOutFrm.grid(column=0,row=0,sticky='W')
        
        self.inBut = ttk.Button(self.inOutFrm,text='輸入圖片',
                            command=self._getIptFileName)
        self.inBut.grid(column=0,row=0)
        self.inEry = ttk.Entry(self.inOutFrm,width=60)
        self.inEry.grid(column=1,row=0)
        
        self.outBut = ttk.Button(self.inOutFrm,text='輸出到',
                                 command=self._getOptFileName)
        self.outBut.grid(column=0,row=1)
        self.outEry = ttk.Entry(self.inOutFrm,width=60)
        self.outEry.grid(column=1,row=1)
        
        for child in self.inOutFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')
        
        #截圖與轉換按鈕
        self.butFrm = ttk.Frame(self.zhuo)
        self.butFrm.grid(column=0,row=1,sticky='W',pady=6)

        self.transBut = ttk.Button(self.butFrm,text='轉換',
                                   command=self._trans)
        self.transBut.grid(column=1,row=0)
        
        for child in self.butFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')

架構

在這裏插入圖片描述

效果

在這裏插入圖片描述

國際化

我們看到,現在我們的程序是中文的。那麼,如何按一下按鈕,就切換成其他語言呢?

I18N.py

首先在 GUI 下新建一個 I18N.py ,把代碼中,所有用到的字符串,設置成屬性,然後分別根據條件,輸入不同的語言,如下:

class I18N():
'''Internationalization'''
    def __init__(self, language):
        if language == 'chi': self.resourceLagChi()
        elif language == 'eng': self.resourceLagEng()
        elif language == 'jap': self.resourceLagJap()
    
    def resourceLagChi(self):
        self.labChi = '中文'
        self.labEng = '英文'
        self.labJap = '日文'
        self.labTrans = '切換語言'
        self.labQuit = '退出'
        self.labStart = '開始'
        self.labTab1 = '圖片轉文字'
        self.labTab2 = 'PDF轉文字'
        self.inBut = '輸入圖片'
        self.inButTab2 = '輸入文件'
        self.outBut = '輸出到'
        self.printScrBut = '截圖'
        self.transBut = '轉換'
        self.iptBut = '從截圖中轉換'
        self.printOptFrm = '文字輸出'
    
    def resourceLagEng(self):
        self.labChi = 'Chinese'
        self.labEng = 'English'
        self.labJap = 'Japanese'
        self.labTrans = 'Change Language'
        self.labQuit = 'Quit'
        self.labStart = 'Start'
        self.labTab1 = 'Img2Txt'
        self.labTab2 = 'PDF2Txt'
        self.inBut = 'Import Image'
        self.inButTab2 = 'Import File'
        self.outBut = 'Save to'
        self.printScrBut = 'ScreenShot'
        self.transBut = 'Transform'
        self.iptBut = 'Transform from ScreenShot'
        self.printOptFrm = 'Text Preview'
        
    def resourceLagJap(self):
        self.labChi = '中國語'
        self.labEng = '英語'
        self.labJap = '日本語'
        self.labTrans = '言語を選択する'
        self.labQuit = '閉じる'
        self.labStart = '始め'
        self.labTab1 = '映像転送文字'
        self.labTab2 = 'PDF転送文字'
        self.inBut = '畫像を導入する'
        self.inButTab2 = '文書を導入する'
        self.outBut = '保存から'
        self.printScrBut = 'キャプチャー'
        self.transBut = 'へんかん'
        self.iptBut = 'スクリーンショットから切り替える
        self.printOptFrm = 'ぷれびゅー'

修改代碼

之後,修改 Tab1.py 代碼,將所有的 字符串,用 I18N 的實例的屬性來表示:

# coding: utf-8
import tkinter as tk
from tkinter import ttk
from sys import exit
from tkinter import scrolledtext
from tkinter import Menu
from Tab2 import *
from I18N import *
class OOP:
    def __init__(self):
        self.win = tk.Tk()
        self.win.resizable(0,0)    #這個是設置窗口不可縮放
        self.i18n = I18N('chi')
        self._createWidget()
        
        
    def _quit():    #設置一個 menu 菜單項的激活函數
        win.quit()    #退出
        win.destroy()   #銷燬
        exit()   #結束程序
    def _chi(self):
        self.win.destroy()
        self.win = tk.Tk()
        self.win.resizable(0,0)    #這個是設置窗口不可縮放
        self.i18n = I18N('chi')
        self._createWidget()
    def _jap(self):
        self.win.destroy()
        self.win = tk.Tk()
        self.win.resizable(0,0)    #這個是設置窗口不可縮放
        self.i18n = I18N('jap')
        self._createWidget()
    def _eng(self):
        self.win.destroy()
        self.win = tk.Tk()
        self.win.resizable(0,0)    #這個是設置窗口不可縮放
        self.i18n = I18N('eng')
        self._createWidget()
        
    def _getIptFileName(self):
        pass
    def _getOptFileName(self):
        pass
    def _screenShot(self):
        pass
    def _trans(self):
        pass
    def _flag(self):
        pass
    
    def _createWidget(self):
        self.menuBar = Menu(self.win)
        self.win.configure(menu=self.menuBar)
        self.win.title(self.i18n.title)
        self.win.iconbitmap(r'../app.ico')
        self.startMenu = Menu(self.menuBar,tearoff=0)
        # pop menus:
        self.I18NMenu = Menu(self.startMenu,tearoff=0)    # 這個是 Menu 中的 Menu 了,可以一直這樣嵌套下去
        self.I18NMenu.add_command(label=self.i18n.labChi,command=self._chi)
        self.I18NMenu.add_command(label=self.i18n.labJap,command=self._jap)
        self.I18NMenu.add_command(label=self.i18n.labEng,command=self._eng)
        self.startMenu.add_cascade(label=self.i18n.labTrans,menu=self.I18NMenu)
        
        
        self.startMenu.add_command(label=self.i18n.labQuit,command=self._quit)
        self.menuBar.add_cascade(label=self.i18n.labStart,menu=self.startMenu)
        
        self.tabControl = ttk.Notebook(self.win)
        self.tab1 = ttk.Frame(self.tabControl)
        self.tab2 = ttk.Frame(self.tabControl)
        self.tabControl.add(self.tab1,text=self.i18n.labTab1)
        self.tabControl.add(self.tab2,text=self.i18n.labTab2)
        self.tabControl.pack(fill='both',expand=1)
        
        self.zhuo = ttk.Frame(self.tab1)
        self.zhuo.grid(column=0,row=0)
        
        # 文件管理欄目
        self.inOutFrm = ttk.Frame(self.zhuo)
        self.inOutFrm.grid(column=0,row=0,sticky='W')
        
        self.inBut = ttk.Button(self.inOutFrm,text=self.i18n.inBut,
                            command=self._getIptFileName)
        self.inBut.grid(column=0,row=0)
        self.inEry = ttk.Entry(self.inOutFrm,width=60)
        self.inEry.grid(column=1,row=0)
        
        self.outBut = ttk.Button(self.inOutFrm,text=self.i18n.outBut,
                                 command=self._getOptFileName)
        self.outBut.grid(column=0,row=1)
        self.outEry = ttk.Entry(self.inOutFrm,width=60)
        self.outEry.grid(column=1,row=1)
        
        for child in self.inOutFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')
        
        #截圖與轉換按鈕
        self.butFrm = ttk.Frame(self.zhuo)
        self.butFrm.grid(column=0,row=1,sticky='W',pady=6)
        self.printScrBut = ttk.Button(self.butFrm,text=self.i18n.printScrBut,
                                   command=self._screenShot)
        self.printScrBut.grid(column=0,row=0)
        self.transBut = ttk.Button(self.butFrm,text=self.i18n.transBut,
                                   command=self._trans)
        self.transBut.grid(column=1,row=0)
        self.iptBut = ttk.Button(self.butFrm,text=self.i18n.iptBut,
                                   command=self._flag)
        self.iptBut.grid(column=2,row=0)
        
        for child in self.butFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')
        
        
        #滑動文字展示欄
        self.printOptFrm = ttk.LabelFrame(self.zhuo,text=self.i18n.printOptFrm)
        self.printOptFrm.grid(row=2,column=0,sticky='W')
        self.scrTxt = scrolledtext.ScrolledText(self.printOptFrm,height=20,width=70,wrap=tk.WORD)
        self.scrTxt.grid(row=0,column=0,sticky='W',padx=6,pady=6)
        
        self.tab2Widget = Tab2(self.tab2,self.i18n)
        
oop = OOP()
oop.win.mainloop()       
  

同樣地,也要修改 Tab2:

# coding: utf-8
import tkinter as tk
from tkinter import ttk
import tkinter as tk
from tkinter import ttk
from PIL import ImageTk,Image
class Tab2():
    def __init__(self,tab,i18n):
        self._createWidget(tab,i18n)
    def _getIptFileName(self):
        pass
    def _getOptFileName(self):
        pass
    def _trans(self):
        pass
        
    def _createWidget(self,tab,i18n):
        self.zhuo = ttk.Frame(tab)
        self.zhuo.grid(row=0,column=0)
                # 文件管理欄目
        self.inOutFrm = ttk.Frame(self.zhuo)
        self.inOutFrm.grid(column=0,row=0,sticky='W')
        
        self.inBut = ttk.Button(self.inOutFrm,text=i18n.inButTab2,
                            command=self._getIptFileName)
        self.inBut.grid(column=0,row=0)
        self.inEry = ttk.Entry(self.inOutFrm,width=60)
        self.inEry.grid(column=1,row=0)
        
        self.outBut = ttk.Button(self.inOutFrm,text=i18n.outBut,
                                 command=self._getOptFileName)
        self.outBut.grid(column=0,row=1)
        self.outEry = ttk.Entry(self.inOutFrm,width=60)
        self.outEry.grid(column=1,row=1)
        
        for child in self.inOutFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')
        
        #截圖與轉換按鈕
        self.butFrm = ttk.Frame(self.zhuo)
        self.butFrm.grid(column=0,row=1,sticky='W',pady=6)

        self.transBut = ttk.Button(self.butFrm,text=i18n.transBut,
                                   command=self._trans)
        self.transBut.grid(column=1,row=0)
        
        for child in self.butFrm.winfo_children():
            child.grid_configure(padx=6,pady=6,sticky='W')

效果展示

運行程序,在菜單欄中,點開始——》切換語言——》日文,就可以出現日文版的軟件啦:
在這裏插入圖片描述
同理,可以切換成英文:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章