使用来自另一个Python进程的数据更新widget,而不阻塞i

2024-09-30 10:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个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和本地化脚本之间实现双向通信。在


Tags: 文件self脚本uimainsys线程label
1条回答
网友
1楼 · 发布于 2024-09-30 10:30:24

解决这个问题的一种方法是在单独的进程中运行对话框,然后使用某种形式的IPC来发送更新。下面的解决方案使用Qt的QLocalServerQLocalSocket类将用json编码的dict传递给对话进程。每当接收到新数据时,服务器都会发出一个信号,对话框连接到该信号以处理更新。当发送进程退出时,服务器进程将自动关闭。在

测试.py

import time
from dlg_server import send_data

for message in 'One Two Three Four Five'.split():
    send_data(message=message)
    time.sleep(2)

dlg公司_服务器.py

^{pr2}$

相关问题 更多 >

    热门问题