자동매매 프로그램을 개발하면서 시간이 많이 걸리는 것 중의 하나가 GUI 부분입니다. 주로 Qt5를 많이 사용하는데, API 혹은 예제를 보고 본인이 원하는 대로 코딩을 해야합니다. Qt5가 워낙 파워풀하고 많이 사용되는 GUI 툴이므로 시간이 된다면 익숙해지는 것이 좋습니다.

 

하지만 본 카페에 계신 많은 분들이 개발을 배우고 계신 상태이다보니 Qt5를 이용한 GUI는 말처럼 쉽지가 앖습니다. 저 또한 Qt5를 자주 사용하지 않다보니, 뭔가를 하려면 일단 긴장부터 하는데요.

 

그래서 간단하게 x, y 위치 주고 화면에 보일 text를 전달하면 화면에 보이는 아주 심플한 package가 없을지 찾아보았습니다. 옛날 dos 시절에 이런 식으로 화면을 디자인했었죠.

 

오늘 소개해드릴 tkinter가 바로 제가 원했던 심플 GUI package입니다.

 

일단 화면부터 보시죠

 

 

 

현재 선물 가격 표시하고(상승/하락에 따라 배경색도 바꿀 수 있음) 양매수 혹은 양매도 하고 있다면 현재가 양합과 수익을 화면에 보여주고 있습니다.

 

사용법은 아주 간단합니다. tkinter를 기반으로 사용하기 쉽게 wrapper 함수를 몇 개 정의하였습니다. 이를 이용하여 첫 번째 선물과 선물 가격을 화면에 출력하는 방법입니다.

 

    window = tk.Tk()
    window.geometry('620x680')

    # for 선물
    create_label(window, 10, 10, '선물', width=10) # (10,10)위치에 "선물" 출력 
    f_label = create_label(window, 80, 10, '', width=10) # (10,10)위치에 현재 선물 가격 출력할 label

    # 실시간 선물 현재가를 받은 후 출력하는 부분
    f_val = 312.44
    update_label(window, f_label, f_val, background='red') # 현재 선물가격 출력
 

 

create_label은 그냥 단순 label을 만드는 함수입니다. x,y 위치, 출력할 데이터, 넓이만 입력하면 됩니다.

그리고 선물 가격을 출력할 label도 별도로 만들어야 합니다. 이 또한 x,y 위치와 넓이만 입력하면 됩니다. text는 향후 update될 예정이므로 그냥 ''을 입력하면 됩니다.

 

xing api에서 선물 가격을 얻은 후 미리 만든 label에 출력하는 방법입니다.

함수명은 update_label이고 사용 방법은 앞에서 만든 label, 출력할 값, 배경색(필요하다면) 입니다.

 

이 두 함수만으로도 다양한 곳에 원하는 값을 쉽게 출력할 수 있습니다. 이 보다 더 간단할 수는 없겠죠.

------------------------------

 

다음으로는 treeview입니다. excel같이 row, col 형식으로 자료를 출력해줍니다.

    # for 양매수
    width = 50
    heads = ['행사가', '매도가', '현재가', '행사가', '매도가', '현재가', '양합', '양합차', '수익']
    widths = [width] * len(heads) 
    widths[8] = 80 # 수익은 더 넓은 공간이 필요해서 변경함
            
    row = 1
    col = 9

    create_label(window, 10, 50, '양매도', width=10)  # (10,50)위치에 "양매도" 출력
    tr_view = create_table(window, 10, 70, row, col, heads, widths, background='#D3D3D3') # gray
 

treeview를 그릴 수 있도록 create_table() 함수를 만들었습니다.

table을 출력할 x,y 위치, table의 구성(row, col), table head에 출력할 문자열, 각 문자열의 넓이, 마지막으로 table의 총 넓이를 입력으로 주면 됩니다.

이때 row는 title을 제외하고 date가 들어가는 row 수를 적으시고, 만약 화면에 보이는 treeview의 넓이가 column 보다 너무 넓으면 width=100 이런 식으로 전체 treeview의 넓이를 지정할 수도 있습니다.

 

추가적으로 필요한 기능이 있습니다. 예를들어 특정 column의 문자열 색을 바꾼다거나, 배경을 바꾸어야할 수도 있습니다. 이런 경우에는 해당 예제와 아래에 있는 문서를 참고하여 sample을 수정하여 사용하시면 됩니다.

 

 

-------------------------------

마지막으로 xing api와 연동하여 실시간으로 양합 값을 update하기 위해서는 thread를 사용하여야합니다. thread를 포함한 예제는 차후에 코드 정리해서 올리도록 하겠습니다.

 

-------------------------------

방금 설명한 tkinter sample 코드는 아래 github에 있습니다. pkinter 설치한 후 실행하시면 됩니다.

pip install pkinter
 
------------------------------
 
 

 

반응형

설정

트랙백

댓글