首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >readyReadStandardOutput信号不工作

readyReadStandardOutput信号不工作
EN

Stack Overflow用户
提问于 2018-07-14 16:10:12
回答 1查看 550关注 0票数 2

我试图使用PyQt5 QProcess类从子进程获得stdout输出。如果我使用waitForFinished(),QMainWindow就会被冻结。但是信号readyReadStandardOutput不能工作,尽管进程已经启动。这是我的代码:

startup.py

代码语言:javascript
运行
复制
from PyQt5.QtCore import QDir, QObject, QProcess
import settings_store
import os.path
import sys


class Getter(QObject):
    process = QProcess()
    output = ''

    def __init__(self):
    super().__init__()
    self.process.setProcessChannelMode(QProcess.MergedChannels)
    self.process.readyReadStandardOutput.connect(self.ready)

    def start(self):
        templates_folder = QDir(templates_path())
        for template in templates_folder.entryList(['*.py'], QDir.Files):
            self.process.start(sys.executable, [file_(template), 'on_startup'])

    def ready(self):
        self.output = bytes(self.process.readAllStandardOutput()).decode('UTF-8').strip()
        print(self.output, 'yeah')


# constants
def templates_path():
    return os.path.join(settings_store.settings_path(), settings_store.directory(), 'templates')


def file_(template):
    return os.path.join(templates_path(), template)

greetings_template.py -模板文件夹中的文件

代码语言:javascript
运行
复制
import sys
import time


def on_startup():
    print('Can we wait a bit?')
    time.sleep(5)
    count = 0
    while count < 5:
        time.sleep(1)
        print("waiting now too")
        count += 1
    print('jeff.find_reagent hello')


if sys.argv[1] == 'on_startup':
    on_startup()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-14 16:37:26

当您正在迭代时,您使用的是相同的QProcess,消除了前面的不正确的任务,您必须为启动的每个.py文件创建一个新的QProcess,另一方面,要返回结果,您必须创建一个信号,因为您不知道在什么时候得到结果。

startup.py

代码语言:javascript
运行
复制
import sys
import os.path

from PyQt5.QtCore import QDir, QObject, QProcess, pyqtSlot, pyqtSignal

import settings_store


class Getter(QObject):
    resultChanged = pyqtSignal(str)
    def start(self):
        templates_folder = QDir(templates_path())
        for template in templates_folder.entryList(['*.py'], QDir.Files):
            process = QProcess(self)
            process.setProcessChannelMode(QProcess.MergedChannels)
            process.readyReadStandardOutput.connect(self.ready)
            process.start(sys.executable, [file_(template), 'on_startup'])

    @pyqtSlot()
    def ready(self):
        process = self.sender()
        output = bytes(process.readAllStandardOutput()).decode('UTF-8').strip()
        print(output, 'yeah')
        self.resultChanged.emit(output)


# constants
def templates_path():
    return os.path.join(settings_store.settings_path(), settings_store.directory(), 'templates')

def file_(template):
    return os.path.join(templates_path(), template)

main.py

代码语言:javascript
运行
复制
from PyQt5.QtWidgets import *

from startup import Getter

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        button = QPushButton("Press me")
        textEdit = QTextEdit()

        widget = QWidget()
        self.setCentralWidget(widget)
        lay = QVBoxLayout(widget)
        lay.addWidget(button)
        lay.addWidget(textEdit)
        getter = Getter(self)
        getter.resultChanged.connect(textEdit.append)
        button.clicked.connect(getter.start)

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51341158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档