U 실시간 데이터 출력(기본) » 이력 » 버전 1
이태훈, 2025/02/10 02:43
| 1 | 1 | 이태훈 | h1. 실시간 데이터 출력(기본) |
|---|---|---|---|
| 2 | |||
| 3 | h3. 소스코드 |
||
| 4 | |||
| 5 | <pre> |
||
| 6 | import multiprocessing as mp |
||
| 7 | import websockets |
||
| 8 | import asyncio |
||
| 9 | import json |
||
| 10 | import sys |
||
| 11 | from PyQt5.QtWidgets import * |
||
| 12 | from PyQt5.QtCore import * |
||
| 13 | |||
| 14 | async def upbit_ws_client(q): |
||
| 15 | uri = "wss://api.upbit.com/websocket/v1" |
||
| 16 | |||
| 17 | async with websockets.connect(uri) as websocket: |
||
| 18 | subscribe_fmt = [ |
||
| 19 | {"ticket":"test"}, |
||
| 20 | { |
||
| 21 | "type":"ticker", |
||
| 22 | "codes":["KRW-BTC"], |
||
| 23 | "isOnlyRealtime":True |
||
| 24 | }, |
||
| 25 | {"format":"SIMPLE"} |
||
| 26 | ] |
||
| 27 | subscribe_data = json.dumps(subscribe_fmt) |
||
| 28 | await websocket.send(subscribe_data) |
||
| 29 | |||
| 30 | while True: |
||
| 31 | data = await websocket.recv() |
||
| 32 | data = json.loads(data) |
||
| 33 | q.put(data) |
||
| 34 | |||
| 35 | async def main(q): |
||
| 36 | await upbit_ws_client(q) |
||
| 37 | |||
| 38 | def producer(q): |
||
| 39 | asyncio.run(main(q)) |
||
| 40 | |||
| 41 | class Consumer(QThread): |
||
| 42 | poped = pyqtSignal(dict) |
||
| 43 | |||
| 44 | def __init__(self, q): |
||
| 45 | super().__init__() |
||
| 46 | self.q = q |
||
| 47 | |||
| 48 | def run(self): |
||
| 49 | while True: |
||
| 50 | if not self.q.empty(): |
||
| 51 | data = q.get() |
||
| 52 | self.poped.emit(data) |
||
| 53 | |||
| 54 | class MyWindow(QMainWindow): |
||
| 55 | def __init__(self, q): |
||
| 56 | super().__init__() |
||
| 57 | self.setGeometry(200, 200, 400, 200) |
||
| 58 | self.setWindowTitle("Upbit Websocket") |
||
| 59 | |||
| 60 | # thread for data consumer |
||
| 61 | self.consumer = Consumer(q) |
||
| 62 | self.consumer.poped.connect(self.print_data) |
||
| 63 | self.consumer.start() |
||
| 64 | |||
| 65 | # widget |
||
| 66 | self.label = QLabel("Bitcoin: ", self) |
||
| 67 | self.label.move(10, 10) |
||
| 68 | |||
| 69 | # QLineEdit |
||
| 70 | self.line_edit = QLineEdit(" ", self) |
||
| 71 | self.line_edit.resize(150, 30) |
||
| 72 | self.line_edit.move(100, 10) |
||
| 73 | |||
| 74 | @pyqtSlot(dict) |
||
| 75 | def print_data(self, data): |
||
| 76 | current_price = int(data.get('tp')) |
||
| 77 | self.line_edit.setText(format(current_price, ",d")) |
||
| 78 | |||
| 79 | if __name__ == "__main__": |
||
| 80 | q = mp.Queue() |
||
| 81 | p = mp.Process(name="Producer", target=producer, args=(q,), daemon=True) |
||
| 82 | p.start() |
||
| 83 | |||
| 84 | # Main process |
||
| 85 | app = QApplication(sys.argv) |
||
| 86 | mywindow = MyWindow(q) |
||
| 87 | mywindow.show() |
||
| 88 | app.exec_() |
||
| 89 | </pre> |
||
| 90 | |||
| 91 | h3. 결과 |
||
| 92 | |||
| 93 | !clipboard-202502101143-pjsmq.png! |