Files
build_self/main.py
2023-12-31 17:57:17 +08:00

87 lines
2.5 KiB
Python

import os
import streamlit as st
from loguru import logger
from app.core import settings
pages = os.listdir(os.path.join(settings.BASE_DIR, 'pages'))
pages = [{
'filename': page,
'filepath': os.path.join(settings.BASE_DIR, 'pages', page)
} for page in pages if page.endswith('.py') and page != '__init__.py']
pages.sort(key=lambda x: x['filename'])
st.set_page_config(
page_title="Leo's Cool App",
page_icon="🧊",
layout="wide",
initial_sidebar_state="expanded",
)
def open_selected_file():
with open(st.session_state.page_file['filepath'], 'r', encoding='utf-8') as f:
st.session_state.file_content = f.read().strip()
st.session_state.file_lines = st.session_state.file_content.splitlines()
def save_file_content():
with open(st.session_state.page_file['filepath'], 'w', encoding='utf-8') as f:
f.write(st.session_state.file_content)
def new_file():
new_file_name = st.session_state.new_file
if not new_file_name.endswith('.py'):
new_file_name = f'{new_file_name}.py'
logger.debug(f"create new file: {new_file_name}")
content = '''
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import streamlit as st
{add_content}
st.write('Hello World!')
'''
with open(os.path.join(settings.BASE_DIR, 'pages', new_file_name), 'w') as f:
content = content.format(add_content=f"""st.markdown("# {st.session_state.new_file}")""").strip()
st.write(f"create new file: {new_file_name}, write: ")
st.code(content, language='python')
f.write(content)
with st.sidebar:
st.selectbox(
'选择要配置的文件',
pages,
index=0,
format_func=lambda x: x['filename'],
on_change=open_selected_file,
key='page_file'
)
st.write('You selected:', st.session_state.page_file)
st.divider()
st.text_input('新建文件', on_change=new_file, key='new_file')
if 'file_content' not in st.session_state:
open_selected_file()
st.write(f'# 当前文件: `{st.session_state.page_file["filename"]}`')
col1, col2 = st.columns(2)
with col1:
st.write('### 代码高亮展示')
st.code(st.session_state.file_content, line_numbers=True)
with col2:
st.write('### 内容编辑区')
st.text_area(
key='file_content',
label_visibility='collapsed',
label='Text to analyze',
on_change=save_file_content,
value=st.session_state.file_content,
height=50 + 22 * len(st.session_state.file_lines),
)