(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()