파이썬으로 연속 조회가 가능한 주식 차트 만들기(tkinter, seolpyo-mplchart)

작성자: [관리자] 하얀설표

2025.05.07 13:33 (KST) 작성됨

2025.05.08 11:04 (KST) 수정됨






(05.08) 수정됨.

주식 차트를 그리는 패키지는 파이썬뿐만이 아니라 여러 프로그래밍 언어마다 존재한다.

이 코드를 단순하게 사용하면 코드를 실행하기 전에 차트를 그릴 데이터를 어떻게 가져오고 처리할지 하나하나 수정해야 하는 번거로움이 있다.

tkinter나 pyqt같은 gui를 사용하면 이런 번거로운 작업을 생략하고, 종목코드만 입력해 해당하는 데이터를 가져오게 만들 수도 있다.

 

 

텐배거 종목 정보를 추가해서 사용하기

이걸 베이스로 기능을 조금 추가하면 이런 것도 가능해진다.

텐배거 종목들은 따로 정리한 글들이 있다.

 

예제 코드

from datetime import datetime
import tkinter as tk

import seolpyo_mplchart as mc
import pandas as pd
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg


class TkChart:
    def __init__(self, window: tk.Tk):
        self.window = window
        self.window.option_add('*Font;, '맑은고딕 14')  # 모든 위젯 기본 폰트 크기 설정
        window.protocol('WM_DELETE_WINDOW', lambda *_: (mc.close('all'), window.destroy()))

        self.add_entry()
        self.add_chart()
        return

    def add_entry(self):
        frame = tk.Frame(self.window)
        frame.grid(column=0, row=0, sticky='w', padx=10, pady=10)

        self.add_entry_code(frame)
        self.add_entry_name(frame)

        self.message = tk.Label(frame)
        self.message.grid(row=1, column=0, pady=(10, 0), sticky='w', columnspan=10)
        return

    def add_entry_code(self, frame):
        tk.Label(frame, text='종목코드:').grid(row=0, column=0)

        self.sv_code = tk.StringVar()
        self.sv_code.trace_add('write', lambda *x: self.validate_code(x))

        self.entry = tk.Entry(frame, textvariable=self.sv_code, width=10, justify='center')
        self.entry.grid(row=0, column=1)
        return

    def add_entry_name(self, frame):
        tk.Label(frame, text='종목명:').grid(row=0, column=2, padx=10)

        self.sv_name = tk.StringVar()

        self.entry = tk.Entry(frame, textvariable=self.sv_name, justify='center', state='disabled')
        self.entry.grid(row=0, column=3)
        return

    code = ''
    def validate_code(self, *_):
        value = self.sv_code.get()
        if not value: self.sv_code.set('')
        else:
            try: int(value)
            except: self.sv_code.set(self.code)
            else:
                len_code = len(value)
                if 6 < len_code: self.sv_code.set(self.code)
                else: self.code = value
                if len_code == 6: self.set_chart(self.code)
        return

    def add_chart(self):
        self.now = datetime.now()
        self.chart = mc.SliderChart()

        frame = tk.Frame(self.window)
        frame.grid(column=0, row=1, sticky='ewsn')
        self.window.columnconfigure(0, weight=1)
        self.window.rowconfigure(1, weight=1)

        self.agg = FigureCanvasTkAgg(self.chart.figure, frame)
        widget = self.agg.get_tk_widget()
        widget.grid(column=0, row=0, sticky='ewsn')
        frame.columnconfigure(0, weight=1)
        frame.rowconfigure(0, weight=1)

        self.set_chart()
        return

    def set_chart(self, code='005930'):
        self.message['text'] = '메세지: 차트 데이터 가져오는 중..'
        price_list = {차트 데이터를 가져오는 코드}
        if not price_list:
            self.message['text'] = '메세지: 종목코드를 확인해주세요.'
        else:
            name = price_list[-1]['name']
            self.sv_code.set(code)
            self.sv_name.set(name)

            self.chart.watermark = f'{name}({code})'
            self.chart.set_data(pd.DataFrame(price_list))
            self.agg.draw()

            self.message['text'] = '메세지: 차트 변경 완료.'
        return


def run():
    root = tk.Tk()
    _ = TkChart(root)
    root.mainloop()
    return


if __name__ == '__main__':
    run()

 

 






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #Python 관련 게시물