调用gnuplot时如何保持PyQt5响应? [英] How to keep PyQt5 responsive when calling gnuplot?

查看:33
本文介绍了调用gnuplot时如何保持PyQt5响应?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Python GUI和gnuplot创建图.我正在用Python生成代码并将其发送到gnuplot.这基本上可以将管道数据传输到gnuplot,但是:

I am trying to create plots with a Python GUI and gnuplot. I am generating the code in Python and send it to gnuplot. This basically works with piping data to gnuplot, but:

缺点:

  1. 在关闭gnuplot之前,Python程序将被阻止
  2. 每次绘制图时,您都必须一次又一次地加载/启动gnuplot(在慢速的计算机上),这似乎会花费额外的时间

我的问题:

  1. 如何保持Python程序的响应速度?
  2. 有没有一种方法可以一次启动gnuplot并使其保持运行状态?
  3. 如果有新图,如何只更新gnuplot终端?

感谢您的提示和链接.

这是我的代码:

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit, QPushButton
import subprocess

class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,400,200)
        self.myTextEdit = QPlainTextEdit()
        self.myTextEdit.setPlainText("plot sin(x)")
        self.button = QPushButton('Plot code',self)
        self.button.clicked.connect(self.on_button_click)
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.myTextEdit)
        vbox.addWidget(self.button)
        self.setLayout(vbox)
    @pyqtSlot()

    def on_button_click(self):
        gnuplot_str = self.myTextEdit.document().toPlainText() + "\n"
        gnuplot_path = r'C:\Programs\gnuplot\bin\gnuplot.exe'
        plot = subprocess.Popen([gnuplot_path,'-p'],stdin=subprocess.PIPE)
        plot.communicate(gnuplot_str.encode())

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

推荐答案

必须使用 QProcess 而不是使用 subprocess ,它对Qt事件循环友好,如我所示下方:

Instead of using subprocess you must use QProcess which is friendly to the Qt event loop as I show below:

import sys
from PyQt5.QtCore import QProcess, pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit, QPushButton


class MyWindow(QWidget):
    def __init__(self):
        super(MyWindow,self).__init__()
        self.setGeometry(100,100,400,200)
        self.myTextEdit = QPlainTextEdit()
        self.myTextEdit.setPlainText("plot sin(x)")
        self.button = QPushButton('Plot code',self)
        self.button.clicked.connect(self.on_button_click)
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.myTextEdit)
        vbox.addWidget(self.button)
        gnuplot_path = r'C:\Programs\gnuplot\bin\gnuplot.exe'
        self.process = QProcess(self)
        self.process.start(gnuplot_path, ["-p"])

    @pyqtSlot()
    def on_button_click(self):
        gnuplot_str = self.myTextEdit.document().toPlainText() + "\n"
        self.process.write(gnuplot_str.encode())

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

这篇关于调用gnuplot时如何保持PyQt5响应?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆