Python GUI:Tkinter —— 08

文章目录

  • 历史文章导航
    • Tkinter 基本教程
      • Word转手写体软件开发
  • 国际化
    • 新的开始
      • 文件准备
      • 新建GUI
        • 基本架构
        • 效果展示
        • Tab2.py
        • 架构
        • 效果
    • 国际化
      • I18N.py
      • 修改代码
      • 效果展示

历史文章导航

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:首先创建一个项目文件:
Python GUI:Tkinter —— 08_第1张图片
然后在项目文件中,新建一个 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()       

基本架构

Python GUI:Tkinter —— 08_第2张图片

效果展示

Python GUI:Tkinter —— 08_第3张图片

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')

架构

Python GUI:Tkinter —— 08_第4张图片

效果

Python GUI:Tkinter —— 08_第5张图片

国际化

我们看到,现在我们的程序是中文的。那么,如何按一下按钮,就切换成其他语言呢?

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')

效果展示

运行程序,在菜单栏中,点开始——》切换语言——》日文,就可以出现日文版的软件啦:
Python GUI:Tkinter —— 08_第6张图片
同理,可以切换成英文:
Python GUI:Tkinter —— 08_第7张图片

你可能感兴趣的:(Python,GUI开发)