Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用gnuplot时如何保持PyQt5的响应?_Python_Python 3.x_Gnuplot_Pyqt5 - Fatal编程技术网

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

Python 调用gnuplot时如何保持PyQt5的响应?,python,python-3.x,gnuplot,pyqt5,Python,Python 3.x,Gnuplot,Pyqt5,我正在尝试使用Python GUI和gnuplot创建绘图。 我正在用Python生成代码并将其发送给gnuplot。 这基本上适用于gnuplot的管道数据,但是: 缺点: Python程序将被阻止,直到关闭gnuplot 每次绘图时,您都必须一次又一次地加载/启动gnuplot,这似乎需要额外的时间(在速度较慢的计算机上) 我的问题是: 如何保持Python程序的响应性 有没有办法启动gnuplot一次并保持其运行 如果有新的绘图,如何只更新gnuplot终端 谢谢你的提示和链接 这是我的密

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

缺点:

  • Python程序将被阻止,直到关闭gnuplot
  • 每次绘图时,您都必须一次又一次地加载/启动gnuplot,这似乎需要额外的时间(在速度较慢的计算机上)
  • 我的问题是:

  • 如何保持Python程序的响应性
  • 有没有办法启动gnuplot一次并保持其运行
  • 如果有新的绘图,如何只更新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_())
    

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

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

    你需要使用线程。谢谢,@101,这个概念对我来说是新的。我会看一看的。谢谢你,@eyllanesc,这似乎正是我想要的。