Python 调用gnuplot时如何保持PyQt5的响应?
我正在尝试使用Python GUI和gnuplot创建绘图。 我正在用Python生成代码并将其发送给gnuplot。 这基本上适用于gnuplot的管道数据,但是: 缺点: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终端 谢谢你的提示和链接 这是我的密
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,这似乎正是我想要的。