I was looking for a folder browser but could not find anything built-in. As others must need a solution for this, I’m sharing my simple folder browser. Single click selects folder. Double click opens folder. I’m sure that others have come up with better solutions. Please share yours by replying to this post.
import streamlit as st
import os
import csv
import datetime
import pandas as pd
import time
import ctypes
from ctypes import wintypes, windll
from enum import Enum
from os import listdir
from os.path import join, isfile
from datetime import datetime
from pathlib import Path
from dataclasses import astuple, dataclass, field
st.set_page_config(
page_title="TimeAdvisor",
page_icon=None,
layout="wide",
menu_items=None
)
if 'entryIndex' not in st.session_state:
st.session_state.entryIndex = 0
if 'timeEntries' not in st.session_state:
st.session_state.timeEntries = []
if 'root_path' not in st.session_state:
st.session_state.root_path = os.getcwd()
if 'selected_folder' not in st.session_state:
st.session_state.selected_folder = os.getcwd()
if 'selected_path' not in st.session_state:
st.session_state.selected_path = ""
# load the openai_api key
openai_api_key = st.secrets["OpenAI_key"]
def GetDesktopFolder():
CSIDL_DESKTOP = 0
_SHGetFolderPath = windll.shell32.SHGetFolderPathW
_SHGetFolderPath.argtypes = [wintypes.HWND,
ctypes.c_int,
wintypes.HANDLE,
wintypes.DWORD, wintypes.LPCWSTR]
path_buf = ctypes.create_unicode_buffer(wintypes.MAX_PATH)
result = _SHGetFolderPath(0, CSIDL_DESKTOP, 0, 0, path_buf)
return path_buf.value
def GetFolderList(root=None):
if(root == None):
root = os.path.expanduser('G:/Data/')
subfolderObject = [x for x in os.scandir(root) ]
subfolders = [n.name for n in subfolderObject if n.is_dir() == True]
cwd = os.getcwd()
print(cwd)
print("Subfolders(",cwd, ")", subfolders)
return subfolders
@st.dialog("Select Folder")
def file_selector():
root_path = st.session_state.root_path
selected_folder = st.session_state.selected_folder
subfolderObject = [x for x in os.scandir(root_path) ]
subfolders = [n.name for n in subfolderObject if n.is_dir() == True]
subfolders.insert(0,"Parent")
subfolders.insert(0,"Desktop")
st.text_input("Root Folder", value=root_path)
selected_index = 0
pos = 0
for x in subfolders:
if(st.button(x)):
selected_index = pos
if(selected_index == 0): # desktop
st.session_state.root_path = GetDesktopFolder()
st.session_state.selected_folder = ""
subfolders.clear()
elif(selected_index == 1): # parent
st.session_state.root_path = Path(root_path).parent.absolute()
st.session_state.selected_folder = ""
subfolders.clear()
else:
if(st.session_state.selected_folder == subfolders[selected_index]):
st.session_state.root_path = os.path.join(root_path, selected_folder)
st.session_state.selected_folder = ""
subfolders.clear()
else:
st.session_state.selected_folder = subfolders[selected_index]
st.rerun(scope="fragment")
pos += 1
button_label = "Select " + os.path.join(root_path, selected_folder)
if(st.button(button_label, key="selectbutton", type="primary")):
st.session_state.selected_path = os.path.join(root_path, selected_folder)
st.rerun()
def Config():
if(st.button("Select Source Folder", key="SELECTFOLDER")):
file_selector()
st.write("Source folder = ", st.session_state.selected_path)
configTab, reviewTab, submitTab = st.tabs(["Config", "Review", "Submit"])
with configTab:
Config()