
생성일: 2024년 5월 17일 오전 9:31
Streamlit 활용 gui
anacomda prompt 실행하고 가상환경 만들어서 python -m pip install pysimplegui==4.60.5 설치하고 pysimplegui 튜토리얼 들어가서
import PySimpleGUI as sg
if __name__ == "__main__":
# All the stuff inside your window.
layout = [ [sg.Text('Some text on Row 1')],
[sg.Text('Enter something on Row 2'), sg.InputText()],
[sg.Button('Ok'), sg.Button('Cancel')] ]
# Create the Window
window = sg.Window('Window Title', layout)
# Event Loop to process "events" and get the "values" of the inputs
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Cancel': # if user closes window or clicks cancel
break
print('You entered ', values[0])
window.close()
복붙하고 티미널에서실행
pip install auto-py-to-exe 인스톨하고 설정에서 나는 위치를
C:/Users/USER/Desktop/WorkSpace/GUI/runner.py 설정했고
단일파일 설정하고 콘솔 매번 나오기 귀찮으니까 꺼주고
마지막으로 고급에서 --hidden-import 에서 PySimpleGUI 만 추가했음
.PY에서 .EXE로 전환 하면 바이러스 감시 뜨는데
window 보안 - 바이러스 및 위협 방지 - 보호 기록 - 심각에서 복원으로 바꿔주면 끝
The Project - PySimpleGUI Documentation
PysampleGUI docu
import PySimpleGUI as sg
import os.path
class Mainv:
def __init__(self, title):
# All the stuff inside your window.
layout = [
[sg.Text("Some text on Row 1")],
[sg.Text("제목넣는 컴포넌트"), sg.Text("제목넣는 컴포넌트")],
[sg.Input()],
[sg.Button("Button1")],
[sg.Text("Enter something on Row 2"), sg.InputText()],
[sg.Button("Ok"), sg.Button("Cancel")],
]
# Create the Window
window = sg.Window(title, layout)
# Event Loop to process "events" and get the "values" of the inputs
while True:
event, values = window.read()
if (
event == sg.WIN_CLOSED or event == "Cancel"
): # if user closes window or clicks cancel
break
if (
event == "Button1"
): # if user closes window or clicks cancel
print("버튼1이눌려짐")
# print("You entered ", values[0])
window.close()
import PySimpleGUI as sg
import os.path
class Mainv:
def __init__(self):
left_col = [
[
sg.Text("이미지가 들어있는 폴더를 선택해주세요"),
sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),
sg.FolderBrowse(button_text="열기"),
],
[
sg.Listbox(
values=[], enable_events=True, size=(40, 20), key="-FILE LIST-"
)
],
]
image_col = [
[sg.Text("선택한 폴더의 이미지 리스트")],
[sg.Text(size=(40, 1), key="-TOUT-")],
[sg.Image(key="-IMAGE-")],
]
layout = [[sg.Column(left_col), sg.VSeparator(), sg.Column(image_col)]]
window = sg.Window("이미지뷰어", layout)
while True:
event, values = window.read()
if event in (None, "Exit"):
break
if event == "-FOLDER-":
folder = values["-FOLDER-"]
try:
file_list = os.listdir(folder)
# print(file_list)
except Exception as e:
print(e)
file_list = []
fnames = [
f
for f in file_list
if os.path.isfile(os.path.join(folder, f))
and f.lower().endswith((".png", ".jpg", "jpeg", ".tiff", ".bmp"))
]
window["-FILE LIST-"].update(fnames)
# 테이블객체로 리스트업
elif event == "-FILE LIST-":
try:
filename = os.path.join(
values["-FOLDER-"], values["-FILE LIST-"][0]
)
window["-TOUT-"].update(filename)
window["-IMAGE-"].update(filename=filename)
except Exception as e:
print(e)
pass
window.close()
stramlit 실습

conda create -n 가상환경 이름 = 가상환경 만들기
conda env list = 가상환경 체크
conda activate 가상환경 이름 = 환경 바꾸기
Stramlit
Streamlit • A faster way to build and share data apps
stramlit 홈페이지 링크
pynecone(파인콘) → Reflex(리플렉스)
Reflex · Web apps in Pure Python
Reflex 홈페이지 링크
Alternative(얼터너티브)
Alternative 홈페이지 링크
pip install streamlit 으로 설치
pip freeze → requirements.txt
pip install -r requirements.txt = requirements.txt 파일 설치 같은 경로에있어야함

명령어에 streamlit hello를 치면

이렇게 나오면 성공이다
import streamlit as st
import numpy as np
import pandas as pd
class VView:
def __init__(self, appname):
st.title(appname)
st.title(":sunglasses:")
st.title(":sunglasses:")
st.header("데이터를 보여드릴께요! :sparkles:")
st.caption("이미지입니다. :sparkles:")
sample_code = '''
function01():
print("조회됨")'''
st.code(sample_code, language='python')
st.text("제가만들 모델은 이러이러하다")
st.markdown("# 안녕하세요")
st.html("<h1>안녕하세요</h1>")
st.html("<hr>")
st.title("데이터프레임")

코드 실행 화면
이제 사용 해볼건
pandas가 제공하는 자료구조 Series, DataFrame
넘파이의 nd.array 자료구조와 Series
df 엑셀처럼 행과 열로 되어있다 2차원
2 행 열
행 가로 로우 rows
열 세로 컬럼 column
자료구조에서 [행] 이 먼저 온다.
ex) [1행[”홍길동”, 45, “서울”]2행[”이순신”, 55, “부산”]]
시리즈 자료구조가 모여서 데이터 프레임을 이룬다.
백터 매트릭스 텐서
이제 데이터 프레임을 만들어보자
import streamlit as st
import numpy as np
import pandas as pd
import datetime
from datetime import datetime as dt
class VView:
def __init__(self, appname):
st.title(appname)
st.title(":sunglasses:")
st.title(":sunglasses:")
st.header("데이터를 보여드릴께요! :sparkles:")
st.caption("이미지입니다. :sparkles:")
sample_code = """
function01():
print("조회됨")"""
st.code(sample_code, language="python")
st.text("제가만들 모델은 이러이러하다")
st.markdown("# 안녕하세요")
st.html("<h1>안녕하세요</h1>")
st.html("<hr>")
st.title("데이터프레임")
# 리스트, 튜플, 셋트, 딕셔너리
dataframe = pd.DataFrame(
{
"first column": [1, 2, 3, 4],
"second column": [10, 20, 30, 40],
}
)
st.dataframe(dataframe, use_container_width=False)
st.table(dataframe)
st.metric(label="온도", value="24°C", delta="12°C")
st.metric(label="삼성전자", value="77,400 원", delta="800 원")
col1, col2, col3 = st.columns(3)
col1.metric(label="달러USD", value="1,355 원", delta="-12.00 원")
col2.metric(label="일본JPY(100엔)", value="870.63 원", delta="-7.44 원")
col3.metric(label="유럽연합EUR", value="1,471.82 원", delta="11.44 원")
st.html("<hr>")
button = st.button("눌러주세요")
button2 = st.button("되돌리기")
if button:
st.write(":blue[버튼]이 눌렸습니다 :sparkles:")
if button2:
pass
st.download_button(
label="CSV로 다운로드",
data=dataframe.to_csv(),
file_name="sample data.csv",
mime="text/csv",
)
st.link_button("Go to Naver", "https://www.naver.com")
agree = st.checkbox("동의?")
if agree:
st.write("감사합니다. :100:")
# 선택 박스
mbti = st.selectbox(
"당신의 MBTI는 무엇입니까?", ("ISTJ", "ENFP", "선택지 없음"), index=2
)
# 다중 선택 박스
options = st.multiselect(
"당신이 좋아하는 과일은 뭔가요?",
["망고", "오렌지", "사과", "바나나"],
["망고", "오렌지"],
)
# 슬라이더
values = st.slider(
"범위의 값을 지정할 수 있어요 :sparkles:", 0.0, 100.0, (25.0, 75.0)
)
st.write("선택 범위:", values)
title = st.text_input(label="나이입력", placeholder=20)
title2 = st.text_area(label="나이입력", placeholder="나이를 입력해주세요")
number = st.number_input(
label="숫자를 입력해주세요 :sparkles:", placeholder="나이를 입력해주세요"
)
import streamlit as st
import numpy as np
import pandas as pd
import datetime
from datetime import datetime as dt
import random
from streamlit.components.v1 import html
class lotto:
def __init__(self, appname):
st.title(appname)
st.header("lotto :sparkles:")
def generate_lotto():
lotto = set()
while len(lotto) < 6:
number = random.randint(1, 46)
lotto.add(number)
lotto = list(lotto)
lotto.sort()
return lotto
# st.subheader(f'행운의 번호: :green[{generate_lotto()}]')
# st.write(f"생성된 시각: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}")
button = st.button('로또를 생성해 주세요!')
if button:
for i in range(1, 6):
st.subheader(f'{i}. 행운의 번호: :green[{generate_lotto()}]')
st.write(f"생성된 시각: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}")
차트 실습을 해보자 그 전에
python -m pip install -U matplotlib
pip install seaborn 을 설치하자
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# class chart:
# def __init__(self, appname):
# st.title(appname)
# plt.rcParams['font.family'] = "AppleGothic"
# plt.rcParams['font.family'] = "NanumGothic"
plt.rcParams['font.family'] ="Malgun Gothic"
plt.rcParams['axes.unicode_minus'] = False
# 폰트 파일 경로로 설정해주는 방법도 있다
# DataFrame 생성
data = pd.DataFrame({
'이름': ['영식', '철수', '영희'],
'나이': [22, 31, 25],
'몸무게': [69.4, 155.15, 45.45]
})
st.dataframe(data, use_container_width=True)
fig, ax = plt.subplots()
ax.bar(data['이름'], data['몸무게'])
st.pyplot(fig)
barplot = sns.barplot(x = '이름', y = '몸무게', data=data, ax=ax, palette='Set2')
fig = barplot.get_figure()
st.pyplot(fig)
파일 업로드를 실습해보자
pip install openpyxl 를 설치하자
import streamit as st
import pandas as pd
import time
# 파일 업로드 버튼 (업로드 기능)
file = st.file_uploader("파일 선택(csv or excel)", type=['csv', 'xls', 'xlsx'])
time.sleep(3)
# Excel or CSV 확장자를 구분하여 출력하는 경우
if file is not None:
ext = file.name.split('.')[-1]
if ext == 'csv':
# 파일 읽기
df = pd.read_csv(file)
# 출력
st.dataframe(df)
elif 'xls' in ext:
# 엑셀 로드
df = pd.read_excel(file, engine='openpyxl')
# 출력
st.dataframe(df)
stockchart 를 실습해보자
pip install finance-datareader
pip install beautifulsoup4
pip install plotly 를 설치하자
import streamlit as st
import FinanceDataReader as fdr
import datetime
date = st.date_input(
"조회 시작일을 선택해 주세요",
datetime.datetime(2024, 5, 17)
)
code = st.text_input(
'종목코드',
value='000660', # SK하이닉스 종목코드
placeholder='종목코드를 입력해 주세요'
)
if code and date:
df = fdr.DataReader(code, date)
data = df.sort_index(ascending=True).loc[:, 'Close']
st.line_chart(data)