我正在运行一个Python脚本来提取和本地化一些文件。我想使用QDialog
来显示QProgressBar
的进度状态,以及正在复制的文件列表。在
首先让我说本地化脚本不能集成到PyQt脚本中,否则我知道解决方案会非常简单。我需要将本地化脚本与UI分开,并让它们同时运行。在
我考虑过通过线程从本地化脚本运行UI,以避免它阻塞本地化过程。但在这一点上,我不知道如何更新UI元素,因为我没有一个实例可以调用和更新,因为我已经用线程启动了它。在
以下是对话框代码的简化示例:
from PyQt5 import QtCore, QtWidgets
import sys
class Ui_dialog_main(object):
def setupUi(self, dialog_main):
dialog_main.setWindowTitle("Test")
dialog_main.resize(390, 120)
self.progress_bar = QtWidgets.QProgressBar(dialog_main)
self.progress_bar.setGeometry(QtCore.QRect(10, 60, 371, 30))
self.label_localizing = QtWidgets.QLabel(dialog_main)
self.label_localizing.setGeometry(QtCore.QRect(10, 10, 81, 25))
self.label_localizing.setText("Package:")
QtCore.QMetaObject.connectSlotsByName(dialog_main)
def start():
app = QtWidgets.QApplication(sys.argv)
dialog_main = QtWidgets.QDialog()
ui = Ui_dialog_main()
ui.setupUi(dialog_main)
dialog_main.show()
sys.exit(app.exec_())
这就是我在定位器文件中启动线程的方法:
^{pr2}$其中LocManager
是ui.py文件的名称。在
当然,这样主脚本就不会被ui卡住,这是我的目标之一——但我不知道在这种情况下如何更新进度条和标签。我发现有好几条线索在讨论类似的问题,但没有一条线索能对我的问题有所帮助。在
我希望我的描述足够清楚。在
更新:
我找到了这个here的解决方案,使用管道。如果这个方法不合适的话,我也不确定。我没有像链接中描述的那样使用两个PyQt GUI之间的“双向通信”,而是修改了代码,使GUI和本地化脚本之间实现双向通信。在
解决这个问题的一种方法是在单独的进程中运行对话框,然后使用某种形式的IPC来发送更新。下面的解决方案使用Qt的
QLocalServer
和QLocalSocket
类将用json编码的dict
传递给对话进程。每当接收到新数据时,服务器都会发出一个信号,对话框连接到该信号以处理更新。当发送进程退出时,服务器进程将自动关闭。在测试.py:
dlg公司_服务器.py:
^{pr2}$相关问题 更多 >
编程相关推荐