[개발이야기] 파이썬을 이용하여 암호화폐 실시간 시세보기(2)

in #kr6 years ago (edited)

윈도우 기반의 프로그램은 기본적으로 event-driven 방식으로 코딩을 해야한다. 즉 사용자의 입력에 따라서 반응하는 방식으로 동작한다. 그런데 사용자가 가만히 있을 때도 뭔가를 해야하는 경우가 많기 때문에 timer 방식을 많이 사용한다. timer도 하나의 이벤트로 보는 것이다. 기존 C 언어에 익숙한 사람들은 약간 적응하기 어려운 개념이다. 하지만 윈도우 기반의 프로그램은 기본적으로 이런 방식이기 때문에 적응을 해야 한다.

개발환경

  • IDE : Visual Studio
  • 사용언어 : 파이썬
  • GUI : PyQt
  • GUI Design : desinger from PyQt
  • 거래소 API

전체적인 흐름

  1. 시작 버튼을 누르면 timer가 동작한다.
  2. 주기적으로 timer특정함수가 호출된다.
  3. Timer특정함수에서 여러 거래소의 시세를 읽은 후거래소별 현재 시세를 화면에 보여준다.
  4. stop이 눌러질 때 까지 2-3번이 반복된다.

Gui디자인하기

designer를 이용하여 원하는 widget을 선택한 후 원하는 위치에 배치한다. 파이썬 소스에서 사용할 Widget의 이름도 바꾼다.

이번 프로그램에서 사용할 widget은 푸시버튼과 테이블이다. 푸쉬 버튼은 시세 받기 시작과 중지를 위함이고, 테이블은 받은 시세를 보여주기 위함이다.

designer에서 만든 내용을 개발 중인 파이썬 파일과 같은 위치에 저장한다. 이 파일명을 파이썬 소스에서 사용한다.

푸시버튼 사용하기

푸시버튼을 눌렀을 때 불리어질 함수명을 정의한다. 이 함수에서는 아래 일을 한다.

  • Start가 눌려지면 timer를 시작한다. 푸시버튼의 이름을 stop으로 바꾸어준다.

  • Stop이 눌려지면 timer를 중지한다. 푸시버튼의 이름을 start로 바꾸어준다.

테이블 사용하기

테이블 위짓은 table형태로 데이터를 보여주는 위짓이다. 테이블 위짓을 사용하기 위해서는 아래 값을 설정해야한다.

  • 테이블의 가로 크기
  • 테이블의 세로 크기
  • 테이블 의 가로/세로 헤더에 들어갈 내용.
  • 테이블 각 셀의 alignment 정보
  • 테이블 셀 별로 배경 색 변경
  • 테이블 셀에 표시할 글자의 색 변경

그리고 테이블의 각 셀에 들어갈 값은 동적으로 설정한다.


실제 코드를 보자.

from PyQt5.QtWidgets import QMainWindow, QApplication
  
import sys
from PyQt5 import QtWidgets, QtCore, QtGui, Qt
from PyQt5 import uic
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem

class Form(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)

        self.ui = uic.loadUi("coinPrice.ui", self)

        # timer 설정
        self.timer = QtCore.QBasicTimer()

        # table widget   가로 세로 크기 설정
        self.row = 6
        self.col = 4
        self.ui.tableWidget.setRowCount(self.row)
        self.ui.tableWidget.setColumnCount(self.col)

        # column header 명 설정.
        self.ui.tableWidget.setHorizontalHeaderLabels(["Upbit", "GoPax", "CoinEx", "BigOne"])
        self.ui.tableWidget.setVerticalHeaderLabels(["BTC", "EOS", "Steem", "SBD", "CET", "One"])

        # right alignment 설정
        item = QTableWidgetItem("")
        self.ui.tableWidget.setItem(0, 0, item)
        item = self.ui.tableWidget.item(0,0)
        item.setTextAlignment(QtCore.Qt.AlignRight)

        self.timerStart = 0
        self.ui.show()

    @pyqtSlot()
    def slotStart(self):
        if (self.timerStart == 0 ) :    # Start가 눌러졌으면
            self.ui.pushButton.setText("Stop")
            self.timerStart = 1
            self.timer.start(3000, self)
        else :     # Stop이 눌러졌으면
            self.ui.pushButton.setText("Start")
            self.timerStart = 0
            self.timer.stop()

이 코드를 실행하면 아래와 같은 화면이 보인다.

image.png

개발 중 문제가 생길 때

테이블위짓의 각 cell에 출력되는 값을 오른쪽으로 align을 하기 위하여 코드를 수정하였다. PyQt 문서에 보면 아래와 같이 나온다.

cubesHeaderItem->setTextAlignment(Qt::AlignVCenter);

관련 문서가 C++ 문법으로 되어 있으므로, 파이썬 방식으로 바꾸면 아래와 같이 된다.

item.setTextAlignment(Qt.AlignRight)

그런데 자꾸만 오류가 발생한다. 그래서 구글링을 해보니, 아래와 같이 바꾸어야 한다고 한다.

item.setTextAlignment(QtCore.Qt.AlignRight)

아무것도 아닌 것이지만 이것을 아는데 1시간이 넘게 걸렸다. 구글링을 먼저 했으면 금방 해결할 수 있을 것인데, 불필요하게 보낸 시간이 아깝다. 개발 과정에 문제가 발생하면 혼자서 끙끙거리지 말고 구글링을 먼저 해보자


이제 데이터만 받아서 채워 넣으면 된다.
다음 편에는 거래소에서 시세를 받아 tableWidget에 보여주는 코드를 설명할 예정이다.


관련 문서

PyQt 매뉴얼 : http://pyqt.sourceforge.net/Docs/PyQt5
PyQt Widget 리스트 : http://pyqt.sourceforge.net/Docs/PyQt5/QtWidgets.html#PyQt5-QtWidgets

Sort:  

파이썬으로 윈도우 GUI 프로그래밍도 가능하군요~ 새로운 것을 알아갑니다.^^
코드를 보니 Java Swing 이 생각납니다.ㅎㅎ

Java Swing 오랜만에 듣는 이름이군요. Widget들이 기본적으로 비슷합니다.

👍👍👍👍👍

Coin Marketplace

STEEM 0.27
TRX 0.13
JST 0.032
BTC 62795.05
ETH 2941.10
USDT 1.00
SBD 3.55