调用gnuplot时如何保持PyQt5的响应?

时间:2018-06-09 05:22:06

标签: python python-3.x gnuplot pyqt5

我正在尝试使用Python GUI和gnuplot创建绘图。 我在Python中生成代码并将其发送到gnuplot。 这基本上适用于管道数据到gnuplot,但是:

缺点:

  1. Python程序被阻止,直到您关闭gnuplot
  2. 你必须一次又一次地加载/启动gnuplot你每次制作一个似乎需要花费额外时间(在慢速计算机上)的情节
  3. 我的问题:

    1. 如何保持Python程序的响应能力?
    2. 有没有办法启动gnuplot并保持运行?
    3. 如果有新情节,如何更新gnuplot终端?
    4. 感谢您提示和链接。

      这是我的代码:

      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_())
      

1 个答案:

答案 0 :(得分:2)

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

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_())