Pyqt5在程序中动态修改多界面的语言(英语转中文或者中文转英语)

继上次写完《如何用Pyqt5实现在程序中动态修改界面的语言(英语转中文或者中文转英语)》一文后,有的朋友提出希望在多个界面中实现动态修改界面语言,而我上次写的文章只能实现主界面的动态语言的修改,不满足朋友的要求,故而写成此文以解决朋友的问题,希望此文对您有帮助!

需要说明的是,本文是在《如何用Pyqt5实现在程序中动态修改界面的语言(英语转中文或者中文转英语)》的基础上完成,如果有读者还不是很了解相关原理,请先阅读那篇文章。

先来看看效果吧:

PyQt中多界面动态修改语言(中英文切换)

原理分析:

0.预备的东西——在子模块中定义好一个“翻译家”
class MySubDialog(QDialog, Ui_Dialog):     # UI与逻辑分离
    def __init__(self, parent=None):
        super(MySubDialog, self).__init__(parent)
        self.setupUi(self)
        self.retranslateUi(self)
        # 翻译家
        self.trans = QTranslator()
        pass
1.获得主应用程序对象实例
_app = QApplication.instance()    
2.主应用程序对象实例为子模块重新安装“翻译家”
 _app.installTranslator(self.subDialog.trans)  
3.子模块调用自己的翻译函数retranslateUi,注意函数的参数
self.subDialog.retranslateUi(self.subDialog)

实际操作:

1.在Qt designer中准备好子模块的UI界面,并保存为SubDialog.ui,我的如下图所示,读者根据自己的需求更改。

在这里插入图片描述

2.打开cmd窗口,进入到Subdialog.ui的文件夹中,利用pyuic5这个程序将Subdialog.ui转化为Subdialog.py文件。
pyuic5 -o Subdialog.py SubDialog.ui
3.同样在cmd窗口中,用pylupdate5命令生成.ts文件(具体详情参考先前的文章)
pylupdate5 Window.py Subdialog.py -ts zh_CN.ts    # 中文
pylupdate5 Window.py Subdialog.py -ts en.ts           # 英文
4.用Qt Linguist.exe(这个程序一般在你安装Python的文件夹/Lib/site-packages/pyqt5-tools下面),用它打开刚刚生成的xxxx.ts文件翻译,这里就不配图了,请参考先前的文章。
5.新建一个Subdialog_Logical.py文件,在该文件中新建一个类MySubDialog,在这个类中写自己的逻辑代码,这么做的目的是为了UI与逻辑分离。这里我为了方便,直接在原先的WindowTest.py中定义了该类,并在该类中添加一个成员变量self.trans,即它的翻译家,读者可根据自己的需求自行更改,我的代码如下。
class MySubDialog(QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(MySubDialog, self).__init__(parent)
        self.setupUi(self)
        self.retranslateUi(self)
        # 翻译家
        self.trans = QTranslator()
        pass
5.给出更改后的WindowTest.py的源代码,运行即可得到视频中的效果。
from Window import Ui_MainWindow
from SubDialog import Ui_Dialog
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from  PyQt5.QtGui import *
import sys

class MyWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.setupUi(self)
        # 注意需要在构造函数中初始化子对话框
        self.subDialog = MySubDialog()

        #  翻译家
        self.trans = QTranslator()

        # 连接到槽函数
        self.BtnEn.clicked.connect(self._trigger_english)
        self.BtnCh.clicked.connect(self._trigger_zh_cn)
        self.BtnOpenSubWindow.clicked.connect(self.openSubWindow)

    def openSubWindow(self):
        # 子窗口显示
        self.subDialog.show()

    def _trigger_english(self):
        print("[MainWindow] Change to English")
        self.trans.load("en")
        _app = QApplication.instance()  # 获取app实例

        _app.installTranslator(self.trans) # 重新翻译主界面
        self.retranslateUi(self)

        _app.installTranslator(self.subDialog.trans) # 为子模块安装翻译
        self.subDialog.retranslateUi(self.subDialog) # 翻译子模块
        pass

    def _trigger_zh_cn(self):
        print("[MainWindow] Change to zh_CN")
        self.trans.load("zh_CN")
        _app = QApplication.instance()

        _app.installTranslator(self.trans)
        self.retranslateUi(self)

        _app.installTranslator(self.subDialog.trans)
        self.subDialog.retranslateUi(self.subDialog)

class MySubDialog(QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(MySubDialog, self).__init__(parent)
        self.setupUi(self)
        self.retranslateUi(self)
        # 翻译家
        self.trans = QTranslator()
        pass


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MyWindow()
    mainWindow.show()
    sys.exit(app.exec_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值