import pandas as pd
import pandas_datareader.data as readData

import tkinter as tk
from tkinter import ttk
from tkinter import Menu

Main_win = tk.Tk()

Main_win.title('Stock BigData')
Main_win.geometry("840x525")
Main_win.resizable(False, False)

def _quit():
Main_win.quit()
Main_win.destroy()
exit()

def _check_search():
stock_code = str(_find_code()) + '.KS'
start_day = topFrame_start_day_entered.get()
end_day = topFrame_end_day_entered.get()

df = pd.DataFrame(readData.DataReader(stock_code, "yahoo", pd.to_datetime(start_day), pd.to_datetime(end_day)))
print(df)

def _find_code():
url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download'
df = pd.read_html(url, header=0)[0]
df = df[['회사명', '종목코드']]
df['종목코드'] = df['종목코드'].astype(str)
df['종목코드'] = df['종목코드'].apply(lambda x: x.zfill(6))

stock_name = topFrame_name_entered.get()

stock_code = df[df['회사명'] == stock_name].iloc[0][1]

return stock_code

topFrame = tk.Frame(Main_win, relief='solid')
topFrame.pack(side='top', fill='both', expand=1)

topFrame_label_1 = ttk.Label(topFrame, text=" 종목명 ")
topFrame_label_1.grid(column=0, row=0, sticky='w', padx=5, pady=5)

topFrame_name = tk.StringVar()
topFrame_name_entered = ttk.Entry(topFrame, width=24, textvariable=topFrame_name)
topFrame_name_entered.grid(column=1, row=0, sticky='w', padx=5, pady=5)

topFrame_label_2 = ttk.Label(topFrame, text=" 시작일 ")
topFrame_label_2.grid(column=2, row=0, sticky='w', padx=5, pady=5)

topFrame_start_day = tk.StringVar()
topFrame_start_day_entered = ttk.Entry(topFrame, width=10, textvariable=topFrame_start_day)
topFrame_start_day_entered.grid(column=3, row=0, sticky='w', padx=5, pady=5)
topFrame_start_day_entered.insert(0, "2000.01.01")

topFrame_label_3 = ttk.Label(topFrame, text=" 종료일 ")
topFrame_label_3.grid(column=4, row=0, sticky='w', padx=5, pady=5)

topFrame_end_day = tk.StringVar()
topFrame_end_day_entered = ttk.Entry(topFrame, width=10, textvariable=topFrame_end_day)
topFrame_end_day_entered.grid(column=5, row=0, sticky='w', padx=5, pady=5)
topFrame_end_day_entered.insert(0, "2020.12.31")

topFrame_button_1 = ttk.Button(topFrame, text="OK", command=_check_search)
topFrame_button_1.grid(column=6, row=0, sticky='w', padx=5, pady=5)

tab_Control = ttk.Notebook(Main_win)
tab1 = ttk.Frame(tab_Control)
tab_Control.add(tab1, text=" 주식 차트 ")
tab_Control.pack(expand=1, fill='both')

tab1_canvas = tk.Canvas(tab1, relief='solid', bg='white', width='800', height='400')
tab1_canvas.grid(column=0, row=0, sticky='w', padx=17, pady=30)

menu_bar = Menu(Main_win)
Main_win.config(menu=menu_bar)

file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Save")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label='File', menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_quit)
menu_bar.add_cascade(label='Help', menu=help_menu)

Main_win.mainloop()



[결과]





종목명의 Text Box에 차트를 그리고 싶은 종목명을 넣으면 그 회사의 주식 데이터를 불러오도록 하자.

야후 파이낸스에서 주가 데이터를 얻기 위해서는 종목코드를 알아야 한다.

회사명을 입력하면 종목코드를 찾을 수 있게 만들자.

한국거래소에서 상장된 주식 리스트를 얻을 수 있다. 리스트에서 종목 코드를 얻을 수 있다.


종목 코드를 얻고 야후 파이낸스로부터 입력된 시작일에서 종료일까지 데이터를 불러오자.


GUI를 실행하고 종목명에 삼성전자를 넣고 OK 버튼을 누르면 다음과 같은 결과가 나온다.






import tkinter as tk
from tkinter import ttk
from tkinter import Menu

Main_win = tk.Tk()

Main_win.title('Stock BigData')
Main_win.geometry("840x525")
Main_win.resizable(False, False)

def _quit():
    Main_win.quit()
    Main_win.destroy()
    exit()

def _check_search():
    stock_name = topFrame_name_entered.get()
    start_day = topFrame_start_day_entered.get()
    end_day = topFrame_end_day_entered.get()

    print(stock_name, start_day, end_day)

topFrame = tk.Frame(Main_win, relief='solid')
topFrame.pack(side='top', fill='both', expand=1)

topFrame_label_1 = ttk.Label(topFrame, text=" 종목명 ")
topFrame_label_1.grid(column=0, row=0, sticky='w', padx=5, pady=5)

topFrame_name = tk.StringVar()
topFrame_name_entered = ttk.Entry(topFrame, width=24, textvariable=topFrame_name)
topFrame_name_entered.grid(column=1, row=0, sticky='w', padx=5, pady=5)

topFrame_label_2 = ttk.Label(topFrame, text=" 시작일 ")
topFrame_label_2.grid(column=2, row=0, sticky='w', padx=5, pady=5)

topFrame_start_day = tk.StringVar()
topFrame_start_day_entered = ttk.Entry(topFrame, width=10, textvariable=topFrame_start_day)
topFrame_start_day_entered.grid(column=3, row=0, sticky='w', padx=5, pady=5)
topFrame_start_day_entered.insert(0, "2000.01.01")

topFrame_label_3 = ttk.Label(topFrame, text=" 종료일 ")
topFrame_label_3.grid(column=4, row=0, sticky='w', padx=5, pady=5)

topFrame_end_day = tk.StringVar()
topFrame_end_day_entered = ttk.Entry(topFrame, width=10, textvariable=topFrame_end_day)
topFrame_end_day_entered.grid(column=5, row=0, sticky='w', padx=5, pady=5)
topFrame_end_day_entered.insert(0, "2020.12.31")

topFrame_button_1 = ttk.Button(topFrame, text="OK", command=_check_search)
topFrame_button_1.grid(column=6, row=0, sticky='w', padx=5, pady=5)

tab_Control = ttk.Notebook(Main_win)
tab1 = ttk.Frame(tab_Control)
tab_Control.add(tab1, text=" 주식 차트 ")
tab_Control.pack(expand=1, fill='both')

tab1_canvas = tk.Canvas(tab1, relief='solid', bg='white', width='800', height='400')
tab1_canvas.grid(column=0, row=0, sticky='w', padx=17, pady=30)

menu_bar = Menu(Main_win)
Main_win.config(menu=menu_bar)

file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Save")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label='File', menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_quit)
menu_bar.add_cascade(label='Help', menu=help_menu)

Main_win.mainloop()

 


[결과]

 

 

 

 

 

 

GUI의 레이아웃을 좋게 하기 위하여 파이썬 코드를 수정하자.

 

상단에 Frame을 추가하고 그 밑으로 Tab이 위치하도록 파이썬 코드를 수정한다.

 

Tab1에 속해 있던 label, StringVar 그리고 Button을 topFrame으로 이동, 상속되도록 한다.

 

tab1에는 주식 차트를 넣기 위해서 Canvas를 추가해준다.

 

 

GUI를 실행해 보면 레이아웃이 더 보기 좋게 된다.

 

주식 차트 탭 안의 흰 바탕에 차트를 넣을 예정이다. 

 

 

 

 

 

 


import tkinter as tk
from tkinter import ttk
from tkinter import Menu

Main_win = tk.Tk()

Main_win.title('Stock BigData')
Main_win.geometry("800x400")
Main_win.resizable(False, False)

def _quit():
    Main_win.quit()
    Main_win.destroy()
    exit()

def _check_search():
    stock_name = tab1_name_entered.get()
    start_day = tab1_start_day_entered.get()
    end_day = tab1_end_day_entered.get()

 

    print(stock_name, start_day, end_day)

tab_Control = ttk.Notebook(Main_win)
tab1 = ttk.Frame(tab_Control)
tab_Control.add(tab1, text=" 주식 데이터 ")

tab_Control.pack(expand=1, fill='both')

tab1_label_1 = ttk.Label(tab1, text=" 종목명 ")
tab1_label_1.grid(column=0, row=0, sticky='W', padx=5, pady=5)

tab1_name = tk.StringVar()
tab1_name_entered = ttk.Entry(tab1, width=24, textvariable=tab1_name)
tab1_name_entered.grid(column=1, row=0, sticky='W', padx=5, pady=5)

tab1_label_2 = ttk.Label(tab1, text=" 시작일 ")
tab1_label_2.grid(column=2, row=0, sticky='W', padx=5, pady=5)

tab1_start_day = tk.StringVar()
tab1_start_day_entered = ttk.Entry(tab1, width=10, textvariable=tab1_start_day)
tab1_start_day_entered.grid(column=3, row=0, sticky='W', padx=5, pady=5)
tab1_start_day_entered.insert(0, "2000.01.01")

tab1_label_3 = ttk.Label(tab1, text=" 종료일 ")
tab1_label_3.grid(column=4, row=0, sticky='W', padx=5, pady=5)

tab1_end_day = tk.StringVar()
tab1_end_day_entered = ttk.Entry(tab1, width=10, textvariable=tab1_end_day)
tab1_end_day_entered.grid(column=5, row=0, sticky='W', padx=5, pady=5)
tab1_end_day_entered.insert(0, "2020.12.31")

tab1_button_1 = ttk.Button(tab1, text="OK", command=_check_search)
tab1_button_1.grid(column=6, row=0, sticky='W', padx=50)

menu_bar = Menu(Main_win)
Main_win.config(menu=menu_bar)

file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_command(label="Save")
file_menu.add_separator()
file_menu.add_command(label="Exit", command=_quit)
menu_bar.add_cascade(label='File', menu=file_menu)

help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label="About", command=_quit)
menu_bar.add_cascade(label='Help', menu=help_menu)

Main_win.mainloop()

 


 

[결과]

 

 

 

 

 

 

+ Recent posts