|
|
|
|
|
"""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 |
|
|