【发布时间】:2018-04-25 16:37:46
【问题描述】:
我正在尝试绘制烛台图。我参考了这个问答(The fastest way to add a new data bar with pyqtgraph)
我希望我的程序通过调用 update() 从服务器接收新值来更新和绘制新烛台。
我遇到的一个问题是,如果不使用 QtCore.QTimer(),此示例将无法运行。例如,如果我在提示符或通过 apscheduler 手动调用 update(),烛台显示没有区别,但一旦我选择绘图窗口,它会同时显示新的烛台。我不明白为什么会这样。
谁能尝试测试一下并告诉我如何解决这个问题?
import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
import random
import numpy as np
from apscheduler.schedulers.background import BackgroundScheduler
class CandlestickItem(pg.GraphicsObject):
def __init__(self):
pg.GraphicsObject.__init__(self)
self.flagHasData = False
def set_data(self, data):
self.data = data
self.flagHasData = True
self.generatePicture()
self.informViewBoundsChanged()
def generatePicture(self):
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):
return QtCore.QRectF(self.picture.boundingRect())
app = QtGui.QApplication([])
data = [
[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()
## DOESN'T SHOW NEW CANDLESTICKS UNLESS YOU SELECT THE PLOT WINDOW
#sched = BackgroundScheduler()
#sched.start()
#sched.add_job(update, trigger='cron', second='*/1')
## WORKS FINE WITH THIS PARAGRAPH.
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(1000)
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
【问题讨论】:
-
如果您还有其他问题,请创建一个新问题,因此:为每个问题创建一个帖子。
-
@eyllanesc 好的!我创建了一个更详细的新问题(stackoverflow.com/questions/47361222/…)。谢谢你的建议。