| | |
| | |
| | """FilePicker for streamlit. |
| | |
| | Still doesn't seem to be a good solution for a way to select files to process from the server Streamlit is running on. |
| | |
| | Here's a pretty functional solution. |
| | |
| | Usage: |
| | |
| | ``` |
| | import streamlit as st |
| | from filepicker import st_file_selector |
| | |
| | tif_file = st_file_selector(st, key = 'tif', label = 'Choose tif file') |
| | ``` |
| | """ |
| |
|
| | import os |
| |
|
| | import streamlit as st |
| |
|
| |
|
| | def update_dir(key): |
| | global i_will_regret_this, i_will_regret_this2 |
| | choice = st.session_state[key] |
| | if os.path.isdir(os.path.join(st.session_state[key + "curr_dir"], choice)): |
| | st.session_state[key + "index"] = 0 |
| | st.session_state[key + "curr_dir"] = os.path.normpath( |
| | os.path.join(st.session_state[key + "curr_dir"], choice) |
| | ) |
| | files = sorted(os.listdir(st.session_state[key + "curr_dir"])) |
| | files.insert(0, "..") |
| | files.insert(0, ".") |
| | st.session_state[key + "files"] = files |
| |
|
| |
|
| | def st_file_selector( |
| | st_placeholder, path=".", label="Select a file/folder", key="selected" |
| | ): |
| | if key + "curr_dir" not in st.session_state: |
| | base_path = "." if path is None or path == "" else path |
| | base_path = ( |
| | base_path if os.path.isdir(base_path) else os.path.dirname(base_path) |
| | ) |
| | base_path = "." if base_path is None or base_path == "" else base_path |
| |
|
| | files = sorted(os.listdir(base_path)) |
| | files.insert(0, "..") |
| | files.insert(0, ".") |
| | st.session_state[key + "files"] = files |
| | st.session_state[key + "curr_dir"] = base_path |
| | st.session_state[key + "index"] = ( |
| | st.session_state[key + "files"].index(os.path.basename(path)) |
| | if os.path.isfile(path) and path[-4:] == '.pth' |
| | else 0 |
| | ) |
| | else: |
| | base_path = st.session_state[key + "curr_dir"] |
| |
|
| | selected_file = st_placeholder.selectbox( |
| | label=label, |
| | options=st.session_state[key + "files"], |
| | index=st.session_state[key + "index"], |
| | key=key, |
| | on_change=lambda: update_dir(key), |
| | ) |
| | selected_path = os.path.normpath(os.path.join(base_path, selected_file)) |
| | st_placeholder.write(os.path.abspath(selected_path)) |
| |
|
| | return selected_path |
| |
|