프로젝트

일반

사용자정보

At 실시간 현재가 차트 » 이력 » 버전 3

이태훈, 2025/02/12 06:20

1 3 이태훈
h1. 실시간 현재가 차트
2 1 이태훈
3
h3. 소스코드
4
5
<pre>
6
import sys
7
import time
8
import pyupbit
9
import pybithumb
10
from PyQt5 import uic
11
from PyQt5.QtWidgets import QApplication, QWidget
12
from PyQt5.QtChart import QLineSeries, QChart, QValueAxis, QDateTimeAxis
13
from PyQt5.QtGui import QPainter
14
from PyQt5.QtCore import Qt, QDateTime, QThread, pyqtSignal
15
16
class PriceWorker(QThread):
17
    dataSent = pyqtSignal(float)
18
19
    def __init__(self, ticker):
20
        super().__init__()
21
        self.ticker = ticker
22
        self.alive = True
23
24
    def run(self):
25
        while self.alive:
26
            data = pyupbit.get_current_price(self.ticker) # 업비트 금액 조회
27
            # data = pybithumb.get_current_price(self.ticker) # 빗썸 금액 조회
28
            time.sleep(1) # 1초에 한번씩 갱신
29
            self.dataSent.emit(data)
30
31
    def close(self):
32
        self.alive = False
33
class ChartWidget(QWidget):
34
    def __init__(self, parent=None, ticker="KRW-BTC"): # 업비트 : KRW-BTC | 빗썸 : BTC
35
        super().__init__(parent)
36
        uic.loadUi("resource/chart.ui", self)
37 2 이태훈
        self.setWindowTitle("실시간 현재가 차트")
38 1 이태훈
        self.ticker = ticker
39
40
        self.viewLimit = 128 # 가로 폭 갯수
41
42
        self.priceData = QLineSeries()
43
44
        self.priceChart = QChart()
45
        self.priceChart.addSeries(self.priceData)
46
        self.priceChart.legend().hide()
47
48
        axisX = QDateTimeAxis()
49
        axisX.setFormat("hh:mm:ss")
50
        axisX.setTickCount(4)
51
        dt = QDateTime.currentDateTime()
52
        axisX.setRange(dt, dt.addSecs(self.viewLimit))
53
54
        axisY = QValueAxis()
55
        axisY.setVisible(True)
56
57
        self.priceChart.addAxis(axisX, Qt.AlignBottom)
58
        self.priceChart.addAxis(axisY, Qt.AlignRight)
59
        self.priceData.attachAxis(axisX)
60
        self.priceData.attachAxis(axisY)
61
        self.priceChart.layout().setContentsMargins(0, 0, 0, 0)
62
63
        self.priceView.setChart(self.priceChart)
64
        self.priceView.setRenderHints(QPainter.Antialiasing)
65
66
        self.pw = PriceWorker(ticker)
67
        self.pw.dataSent.connect(self.appendData)
68
        self.pw.start()
69
70
# --------------------------------------------
71
72
    def appendData(self, currentPrice):
73
        if len(self.priceData) == self.viewLimit:
74
            self.priceData.remove(0)
75
        dt = QDateTime.currentDateTime()
76
        self.priceData.append(dt.toMSecsSinceEpoch(), currentPrice)
77
        self.__updateAxis()
78
79
    def __updateAxis(self):
80
        pvs = self.priceData.pointsVector()
81
        dtStart = QDateTime.fromMSecsSinceEpoch(int(pvs[0].x()))
82
        if len(self.priceData) == self.viewLimit:
83
            dtLast = QDateTime.fromMSecsSinceEpoch(int(pvs[-1].x()))
84
        else:
85
            dtLast = dtStart.addSecs(self.viewLimit)
86
87
        ax = self.priceChart.axisX()
88
        ax.setRange(dtStart, dtLast)
89
90
        ay = self.priceChart.axisY()
91
        dataY = [v.y() for v in pvs]
92
        ay.setRange(min(dataY) - 10000, max(dataY) + 10000) # 여유가 없는 경우 최대/최소로만 그려짐
93
94
    def closeEvent(self, event):
95
        self.pw.close()
96
97
if __name__ == "__main__":
98
    app = QApplication(sys.argv)
99
    cw = ChartWidget()
100
    cw.show()
101
    exit(app.exec_())
102
</pre>
103
104
h3. 결과
105
106
!clipboard-202502121340-xsm1q.png!