继上次写完《如何用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_())