当 COM 事件发生时,如何更新自定义图形项(在 pyqtgraph 中)?

2023-12-11

我做了一个程序,实时接收原油期货的每笔交易信息。基本上,OnReceiveRealData当事务执行并调用时执行real_get方法。在该方法中,收集当前时间、价格和数量数据并用它们制作字典。有更多方法可以从实时流数据中制作 OHLC 格式数据,但我的问题是如何update自定义图形项目(烛台图)real_get方法被调用?

class COM_Receiver(QAxWidget):
    def __init__(self):
        super().__init__()
        self._create_com_instance()

        self.list_items = ['CLF18']

        self.OnReceiveRealData.connect(self.real_get)
        self.OnEventConnect.connect(self._event_connect)

    def _create_com_instance(self):
        self.setControl("KFOPENAPI.KFOpenAPICtrl.1")

    def _event_connect(self, err_code):
        if err_code == 0:
            print("connected")
            self.real_set()
        else:
            print("disconnected")
        self.login_event_loop.exit()

    def connect(self):
        self.dynamicCall("CommConnect(1)")
        self.login_event_loop = QEventLoop()                                   
        self.login_event_loop.exec_()

    def real_set(self):
        self.dynamicCall("SetInputValue(str, str)", "itemCode", ';'.join(self.list_items))
        ret = self.dynamicCall("CommRqData(str, str, str, str)", "itemCurrent", "opt10005", "", "1001")

    def real_get(self, code, realtype, realdata):
        if realtype == 'itemCurrent':
            eventTime = ( datetime.utcnow() + timedelta(hours=2) )
            currentPrice = self.dynamicCall("GetCommRealData(str, int)", "itemCurrent", 140)
            currentVolume = self.dynamicCall("GetCommRealData(str, int)", "itemCurrent", 15)

            dic_current = {'eventTime':eventTime, 'currentPrice':currentPrice, 'currentVolume':currentVolume}  

            self.make_ohlc(self.plt, dic_current)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    c = COM_Receiver()
    c.connect()

    sys.exit(app.exec_())

我参考了这篇文章(使用 pyqtgraph 添加新数据栏的最快方法)并意识到我可以更新烛台而无需删除和创建CandlestickItem()每当收到新数据时都会实例化(这就是我现在的做法,它消耗了大量资源)。

我尝试制作 CandlestickItem() 实例并用set_data然而,它不能很好地工作,并且除非我单击图表(plt = pg.plot()),否则不会显示更新的烛台。也就是说,如果我离开程序大约 10 分钟,图表不会显示任何差异,但是一旦我单击图表,它就会立即显示最后 10 分钟的所有新烛台。我希望它实时显示新的烛台,即使我不连续单击图表。

我怎样才能随时更新自定义图形项目real_get方法被调用OnReceiveRealData事件在COM_Receiver班级?我认为item.set_data(data=dic_current)应该运行在real_get方法,但到目前为止我所尝试的方法并没有达到我的预期。

下面的源是本文中烛台示例的完整源。

import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
import random

## Create a subclass of GraphicsObject.
## The only required methods are paint() and boundingRect() 
## (see QGraphicsItem documentation)
class CandlestickItem(pg.GraphicsObject):
    def __init__(self):
        pg.GraphicsObject.__init__(self)
        self.flagHasData = False

    def set_data(self, data):
        self.data = data  ## data must have fields: time, open, close, min, max
        self.flagHasData = True
        self.generatePicture()
        self.informViewBoundsChanged()

    def generatePicture(self):
        ## pre-computing a QPicture object allows paint() to run much more quickly, 
        ## rather than re-drawing the shapes every time.
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('w'))
        w = (self.data[1][0] - self.data[0][0]) / 3.
        for (t, open, close, min, max) in self.data:
            p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
            if open > close:
                p.setBrush(pg.mkBrush('r'))
            else:
                p.setBrush(pg.mkBrush('g'))
            p.drawRect(QtCore.QRectF(t-w, open, w*2, close-open))
        p.end()

    def paint(self, p, *args):
        if self.flagHasData:
            p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        ## boundingRect _must_ indicate the entire area that will be drawn on
        ## or else we will get artifacts and possibly crashing.
        ## (in this case, QPicture does all the work of computing the bouning rect for us)
        return QtCore.QRectF(self.picture.boundingRect())

app = QtGui.QApplication([])

data = [  ## fields are (time, open, close, min, max).
    [1., 10, 13, 5, 15],
    [2., 13, 17, 9, 20],
    [3., 17, 14, 11, 23],
    [4., 14, 15, 5, 19],
    [5., 15, 9, 8, 22],
    [6., 9, 15, 8, 16],
]
item = CandlestickItem()
item.set_data(data)

plt = pg.plot()
plt.addItem(item)
plt.setWindowTitle('pyqtgraph example: customGraphicsItem')


def update():
    global item, data
    data_len = len(data)
    rand = random.randint(0, len(data)-1)
    new_bar = data[rand][:]
    new_bar[0] = data_len
    data.append(new_bar)
    item.set_data(data)
    app.processEvents()  ## force complete redraw for every plot

timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(100)

## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

在CandlestickItem类中,在generatePicture方法调用self.update()的最后

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

当 COM 事件发生时,如何更新自定义图形项(在 pyqtgraph 中)? 的相关文章

随机推荐

  • 气流可以在不重新启动调度程序的情况下加载 dags 文件吗

    就我而言 我在 dags 路径下编写了一个 dag 文件 启动airflow调度程序后 成功加载dag文件 但是 更改 dag 文件后 无法加载 dag 文件 有没有建议加载 dag 文件而不重新启动调度程序 您的 DAG 应根据调度程序心
  • 无法查看从 Subversion 存储库中删除的文件的内容

    不久前我从 Subversion 存储库中删除了一个文件 现在我想看看它的内容 我确定该文件在修订版 68 中已被删除 因此我尝试了以下操作 svn cat r 67 path to file 从项目根目录 svn 告诉我svn E1550
  • MySqli:可以创建数据库吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我一直在筛选 MySQLi 文档 据我所知 我无法使用 PHP 和 MySQLi 创建数
  • 在 Webkit .NET 中打开本地文件

    由于某种原因 简单的 WebKitBrowser1 Navigate localfilehere 不起作用 我尝试将 file 添加到 URL 但这也不起作用 这看起来很荒谬 但是这个功能真的不存在吗 看来您输入了错误的网址 你可以通过以下
  • 嵌套相对定位的div需要有100%的高度

    我试图在这里获取嵌套的 div canvas 白色区域 http osf Fivetoolsoftware com填满 100 的空白空间 这是 HTML
  • 在服务器中创建文件后使用 jQuery 下载文件

    当我单击客户端上的按钮时 我想使用 AJAX 在服务器端调用公共静态 Web 方法 静态方法将创建适当的文件 创建文件后 我需要将其下载到客户端桌面 我找到了John Culvinar 的 jquery 文件下载插件但到目前为止还未能实施
  • 语句和关键字有什么区别?

    After calling return一份声明 这是在评论中向我提出的 return不是一个语句 它是开始 return 语句的关键字 有什么区别一份声明 and 开始语句的关键字 句子和句子开头的名词有什么区别 return是一个关键字
  • 在 Selenium for Python 中,如何获取元素的属性而不是属性?

    根据文档 获取属性实际上返回属性而不是属性 除非该属性不存在 在这种情况下它会回退到属性 获取属性将始终归还财产 有没有办法始终获取该属性 我觉得奇怪的是 名为 get attribute 的函数会优先考虑属性值而不是属性值 获取属性 属性
  • 如何使用 Tesseract API 迭代单词?

    我正在尝试与 Tesseract API 并行地学习 Python 我的最终目标是学习如何使用 Tesseract API 来读取文档并进行一些基本的错误检查 我发现了一些似乎是不错的起点的示例 但我无法理解两段代码之间的差异 尽管行为不同
  • 如何通过 Facebook API 发布包含多张照片的状态?

    我的 Facebook Graph API 有问题 有没有办法使用 Graph API Javascript SDK 在状态帖子中附加多张照片 使用 iOS Facebook 应用程序可以发布包含多张照片的状态 然而 在浏览了互联网上的文档
  • 您可以在加载的项目上创建 VC++ 解决方案集预处理器 #defines 吗?

    我有一个支持 define 的库来控制它的构建方式 然而 该库可以被需要不同版本的多个 EXE 项目使用 我可以让 app EXE 项目设置 define 在构建时由库使用 或者在解决方案中设置吗 我能想到的唯一其他选择是在库项目上创建一个
  • 结账 woocommerce wordpress 中简短描述的解决方案对我不起作用

    我已经使用了我在这里找到的 brasofilo 提供的解决方案结帐 woocommerce wordpress 中的简短描述 但由于某种原因 每个产品的每个描述后都会添加一个冒号 我用萤火虫试图找出它可能来自哪里 它显示在结帐页面上显示的每
  • 返回 Python CGI MySQL 脚本的输出

    我对 Python 和 MySQL 非常陌生 这是我的第一个 Stack 问题 所以 如果我遗漏了一些明显的东西 请提前道歉 但是 在提问之前我确实尝试过研究一下 我正在尝试学习 Python MySQL 和 CGI 脚本编写的基础知识 为
  • 从 k8s 入口动态添加/删除命名主机

    我正在 GKE 上设置 k8s 集群 通配符 DNS server com将指向入口控制器 在集群内部 将有网络服务器 Pod 每个 Pod 都公开一个独特的服务 Ingress 控制器将使用服务器名称来路由到各种服务 服务器几乎每天都会被
  • 当泄漏工具未显示内存泄漏时,如何调试内存泄漏?

    我有一个用 Swift 编写的 iOS 应用程序 该应用程序正在泄漏内存 在某些情况下 一些对象应该被释放 但它们没有 我通过简单地添加了解了这个问题deinit调试消息如下 deinit println DEINIT KeysProvid
  • 贪心算法无法完成 0-1 背包 p‌r‌o‌b‌l‌e‌m 的情况

    我正在寻找一种情况 其中选择重量 考虑容量为 4 的背包以及具有以下重量和价值的物品 Item Weight Value value Weight A 3 1 65 0 55 B 2 1 0 5 C 2 1 0 5 基于每权重价值的贪婪算法
  • 有没有办法在 Dart 中通过引用传递原始参数?

    我想通过引用传递一个原语 int bool 我在这里找到了关于它的讨论 通过引用传递值类型 段落 Dart 中的值类型 但我仍然想知道是否有办法在 Dart 中做到这一点 除了使用对象包装器 有什么发展吗 Dart 语言不支持这一点 我怀疑
  • 将 Service Broker 与 Sql Server Express 2008 结合使用

    是否可以在 sql Express 上使用外部激活而不通过 sql enterprise standard 我想向 sql Express 服务代理发送一条消息 然后让它通知在同一盒子上运行的外部应用程序服务 以便启动控制台应用程序来拾取消
  • 使用 jQuery.ajax 和 JSONP 设置标头?

    我正在尝试使用 jQuery 访问 google 文档 这是我到目前为止所拥有的 var token my auth token ajax url http docs google com feeds documents private f
  • 当 COM 事件发生时,如何更新自定义图形项(在 pyqtgraph 中)?

    我做了一个程序 实时接收原油期货的每笔交易信息 基本上 OnReceiveRealData当事务执行并调用时执行real get方法 在该方法中 收集当前时间 价格和数量数据并用它们制作字典 有更多方法可以从实时流数据中制作 OHLC 格式