M03-Aiwin 2024-01-24 10:49 采纳率: 75%
浏览 4
已结题

PyQt6中Qprocess遇到的问题:

PyQt6遇到的问题:

import sys
import subprocess
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QPlainTextEdit
from PyQt6.QtCore import QProcess

class CommandRunner(QWidget):
    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('Command Runner')

        self.output_text_edit = QPlainTextEdit(self)

        self.start_button = QPushButton('Start', self)
        self.stop_button = QPushButton('Stop', self)
        self.stop_button.setEnabled(False)

        layout = QVBoxLayout(self)
        layout.addWidget(self.output_text_edit)
        layout.addWidget(self.start_button)
        layout.addWidget(self.stop_button)

        self.start_button.clicked.connect(self.start_command)
        self.stop_button.clicked.connect(self.stop_command)

        self.process = QProcess(self)
        self.process.readyReadStandardOutput.connect(self.update_output)
        self.process.finished.connect(self.command_finished)

    def start_command(self):
        cmd = "python ./JsFinder.py -u http://www.aiwin.fun -t 10"
        self.process.start(cmd)
        self.start_button.setEnabled(False)
        self.stop_button.setEnabled(True)

    def stop_command(self):
        self.process.terminate()

    def update_output(self):
        output = self.process.readAllStandardOutput().data().decode()
        self.output_text_edit.appendPlainText(output)

    def command_finished(self):
        self.start_button.setEnabled(True)
        self.stop_button.setEnabled(False)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = CommandRunner()
    window.show()
    sys.exit(app.exec())

我本来的意愿是当点击start按钮的时候,自动执行命令并将命令的输出实时同步到QPlainTextEdit中,点击停止按钮则会自动停止命令的继续执行,但是现在我的代码当我点击start的时候,没有任何的反应,我要怎么修改代码解决问题?

  • 写回答

2条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-01-24 11:05
    关注

    你的命令没有成功执行的问题可能在于 QProcess 启动外部程序的方式。在你的代码中,self.process.start(cmd) 这行代码,你试图应用 shell 命令来启动 cmd 程序,而 QProcess.start() 是将第一个参数作为可执行文件的路径,并将后续的字符串作为参数。
    你需要将所有的参数都包含在一个列表中作为 QProcess.start() 的参数,然后用可执行文件的路径在列表的第一位。
    修改你的 start_command 函数如下:

    def start_command(self):
        cmd = ["python", "./JsFinder.py", "-u", "http://www.aiwin.fun", "-t", "10"]
        self.process.start(*cmd)
        self.start_button.setEnabled(False)
        self.stop_button.setEnabled(True)
    
    

    这应该能帮助你解决这个问题。如果还有问题,记得检查 JsFinder.py 脚本的路径是否正确,并且这个 python 文件的工作情况是正常的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月1日
  • 已采纳回答 1月24日
  • 创建了问题 1月24日

悬赏问题

  • ¥15 php 同步电商平台多个店铺增量订单和订单状态
  • ¥15 关于logstash转发日志时发生的部分内容丢失问题
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。