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

2024-02-17

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

而不是使用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_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在调用 gnuplot 时保持 PyQt5 响应? 的相关文章

随机推荐

  • laravel 在控制器中的所有方法之间共享变量

    我正在 PHP laravel 框架中制作一个简单的网站 其中顶部导航链接是从数据库动态生成的 我正在主控制器操作中生成 pages 变量并传递到布局文件 我的代码如下 public function home pages Page all
  • 事件驱动架构和事件结构

    我是 EDA 新手 我已经阅读了很多有关其优点的内容 并且可能有兴趣在我的下一个项目中应用它 但仍然不明白一些东西 引发事件时 哪种模式最适合 将事件命名为 CustomerUpdate 并包含有关客户的所有信息 更新或未更新 将事件命名为
  • R data.table 替换另一个 data.table 中值的索引

    您好 仍在尝试找出 data table 如果我有一个包含如下所示值的 data table 那么将这些值替换为另一个 data table 中的值的最有效方法是什么 set seed 123456 a data table date id
  • 如何在 jQuery 中暂停事件?

    我有一个关于事件的问题 基本上 我想在用户单击链接离开页面时运行 jquery 方法 在这个方法中 我想在他们离开之前检查一些事情 所以我知道我可以调用 e preventDefault 但是 如果我在阻止事件后希望事件继续进行怎么办 有什
  • Delphi 中的 Windows API 参数 - 使用或不使用 @ 运算符传递 var 参数?

    我正在尝试使用一个调用的函数设置DiGetDeviceRegistryProperty http msdn microsoft com en us library ff551967 28v vs 85 29 aspx与德尔福7 该调用来自示
  • 具有多行项目的微调器与 Froyo 上的所选项目显示重叠

    我正在尝试创建在所有 Android 版本 直到 Froyo 上看起来都相同的 Spinner 为此 我正在使用无处不在的全息 https github com Prototik HoloEverywhere 一些微调器项目文本超过一行 我
  • 在 Visual Studio 2019 中,WCF 服务(启用 AJAX)不在添加 --> 新项中

    我正在尝试创建一个 Rest Web 服务 并且是 Visual Studio 2019 的新手 创建项目后 我尝试通过右键单击该项目并转到 添加 gt 新项目 来获取 WCF 服务 启用 AJAX 但是 我在任何地方都没有看到这项服务 我
  • 通过 R 中的 geom_text 将小于号“<”添加到 ggplot

    简短版本 我如何使这个人为的代码绘制出正确的希腊贝塔字符和标签字符串的其余部分 以及空格和小于字符以及格式化为键入的数字 library ggplot2 df lt data frame a 1 15 b 6 20 ggplot data
  • JavaScript 数组解构赋值和空值

    我正在使用外部服务getListOfItemsFromServiceA它接受一个id 用户 并返回与该用户关联的 5 个项目 正好 5 个 的列表 我使用数组解构赋值来设置那些工作正常的项目的值 如下所示 仅是一个示例 var item1
  • Automake 变量来整理 Makefile.am

    我有一个目录 src 包含所有源文件 bin 用来在运行 make 命令后存储所有二进制文件 该目录如下所示 BuildDirectory src bin configure Makefile am configure ac 现在在 Mak
  • 注意:未定义索引:变量

    我正在尝试构建以下表格
  • 在Java中,当文件被其他线程锁定时,有没有办法读取该文件?

    因此 我使用以下命令在文件上创建锁定 以便我可以专门对其进行编辑 File file new File filename channel new RandomAccessFile file rw getChannel lock channe
  • HTML5 视频 - 暂停加载/部分加载

    有没有办法预加载视频的一部分 而不是整个视频 我注意到有一个 暂停 事件 表明视频预计不会下载 直到有进一步指示 但我不确定如何触发此事件 我的目标是预加载视频的一部分而不占用所有用户的带宽 Thanks 您可以使用 XHR 预取任何 UR
  • Java SafeVarargs 注释,是否存在标准或最佳实践?

    我最近接触到了java SafeVarargs注解 谷歌搜索 Java 中的可变参数函数不安全的原因让我很困惑 堆中毒 擦除类型 所以我想知道一些事情 是什么使得可变参数 Java 函数在 SafeVarargs有什么意义 最好以深入示例的
  • 自定义包名称 cxf-codegen-plugin

    想象一下这个场景 我有一个名称空间为 a b c 的 wsdl 文件 它导入另一个名称空间为 m n o 的 wsdl 文件 不幸的是 它们都定义了相同的 ComplexTypes XYZ 现在 当我使用 cxf codegen plugi
  • grep IP 地址和开放端口 nmap

    我正在尝试使此脚本使用 nmap 的开放端口来 grep IP 地址 但我无法以正确的方式执行此操作 我有这样的事情 nmap 192 168 0 0 24 sU p 44555 grep oP 0 9 1 3 3 0 9 1 3 gt o
  • 支持 CORS 的服务器发送事件

    我在用ServiceStack 中的服务器发送事件 https github com ServiceStack ServiceStack wiki Server Events我需要允许它跨来源使用 我已经设置了ServiceStackCor
  • C++:有意限制 CPU 使用

    在我的公司 我们经常在 CPU 压力下测试 USB 和 FireWire 设备的性能 我们运行一个测试代码来加载 CPU 它经常用于非常简单的非正式测试 以了解我们的设备性能会发生什么变化 我查看了相关代码 它是一个简单的循环 它增加计数器
  • Python正则表达式处理不同类型的日期

    我正在尝试编写一个正则表达式来识别一些日期 我正在处理的字符串是 string these are just rubbish 11 2 2222 24 3 1695 194475 12 13 1111 32 11 2000 these ar
  • 如何在调用 gnuplot 时保持 PyQt5 响应?

    我正在尝试使用 Python GUI 和 gnuplot 创建绘图 我正在用 Python 生成代码并将其发送到 gnuplot 这基本上适用于将数据传输到 gnuplot 但是 缺点 Python 程序将被阻止 直到您关闭 gnuplot