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

时间:2017-11-18 00:29:44

标签: python pyqtgraph

我制定了一个程序,实时接收原油期货的每一笔交易信息。基本上,OnReceiveRealData在执行事务时执行并调用real_get方法。在该方法中,收集当前时间,价格和体积数据并用它们制作字典。有更多方法可以从这个实时流数据中制作OHLC格式数据,但我的问题是如何{strong>更新自定义图形项(烛台图),只要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_())

我参考了这篇文章(The fastest way to add a new data bar with pyqtgraph),并意识到我可以更新烛台,而无需在收到新数据时删除并创建CandlestickItem()实例(这就是我现在的做法,它消耗了一个很多资源)。

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

如果real_get类中的OnReceiveRealData事件调用了COM_Receiver方法,我怎样才能更新自定义图形项?我认为item.set_data(data=dic_current)应该以{{1​​}}方式运行,但到目前为止我所尝试的并不像我期望的那样工作。

以下来源是该文章中烛台示例的全部来源。

real_get

0 个答案:

没有答案