Как сохранить PyQt5 отзывчивым при вызове gnuplot? - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь создать графики с графическим интерфейсом Python и gnuplot.Я генерирую код на Python и отправляю его в gnuplot.Это в основном работает с передачей данных в gnuplot, но:

Недостатки:

  1. программа Python блокируется, пока вы не закроете gnuplot
  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_())

1 Ответ

0 голосов
/ 09 июня 2018

Вместо использования subprocess вы должны использовать QProcess, который удобен для цикла событий Qt, как я покажу ниже:

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