gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:33 25 4
gpt4 key购买 nike

我正在尝试使用 Python GUI 和 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_())

最佳答案

您必须使用 QProcess 而不是使用 subprocess,它对 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_())

关于python - 调用 gnuplot 时如何保持 PyQt5 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50771171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com