import streamlit as st import os import csv import time uploaded_images = {'characters': {}, 'terrain': {}} def get_image_path(img, name, image_type): file_path = f"data/uploadedImages/{image_type}/{name}/{img.name}" os.makedirs(os.path.dirname(file_path), exist_ok=True) with open(file_path, "wb") as img_file: img_file.write(img.getbuffer()) return file_path def update_csv_file(uploaded_file, name, image_type): csv_file_path = "Resources.csv" # read existing file contents file_contents = set() if os.path.exists(csv_file_path): with open(csv_file_path, mode='r') as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: if row: file_contents.add(tuple(row)) # add new file content file_content = (name, uploaded_file.name, image_type) file_contents.add(file_content) # write updated file contents with open(csv_file_path, mode='w', newline='') as csv_file: csv_writer = csv.writer(csv_file) for row in file_contents: csv_writer.writerow(row) def get_uploaded_files_info(): csv_file_path = "Resources.csv" if os.path.exists(csv_file_path): with open(csv_file_path, mode='r') as csv_file: csv_reader = csv.reader(csv_file) files_info = [] for row in csv_reader: if row: files_info.append(row) return files_info else: return [] def display_images_from_csv(): files_info = get_uploaded_files_info() for row in files_info: name, file_name, image_type = row # remove extension from file name file_name_without_extension = os.path.splitext(file_name)[0] if image_type == 'characters': img_path = f"data/uploadedImages/{image_type}/{name}/{file_name}" st.sidebar.image(img_path, width=100, caption=name) else: img_path = f"data/uploadedImages/{image_type}/{name}/{file_name}" st.image(img_path, width=100, caption=name) def get_table_from_csv(): csv_file_path = "Resources.csv" if os.path.exists(csv_file_path): with open(csv_file_path, mode='r') as csv_file: csv_reader = csv.reader(csv_file) table_rows = [row for row in csv_reader if row] # create markdown table from table rows table_md = "| Name | File Name | Image Type |\n| --- | --- | --- |\n" for row in table_rows: name, file_name, image_type = row # remove extension from file name file_name_without_extension = os.path.splitext(file_name)[0] table_md += f"| {name} | {file_name_without_extension} | {image_type} |\n" return table_md else: return "" # show uploaded images and save them to file image_type = st.selectbox('Choose image type:', options=['characters', 'terrain']) name = st.text_input('Enter a name for the image:') uploaded_files = st.file_uploader('Upload image(s)', type=['png', 'jpg'], accept_multiple_files=True) for uploaded_file in uploaded_files: if uploaded_file is not None: # Get actual image file bytes_data = get_image_path(uploaded_file, name, image_type) uploaded_images[image_type].setdefault(name, []) uploaded_images[image_type][ name].append(bytes_data) st.image(bytes_data, use_column_width=True) update_csv_file(uploaded_file, name, image_type) def display_characters(): if uploaded_images['characters']: st.sidebar.write('**Characters**') for name, files in uploaded_images['characters'].items(): for file in files: st.sidebar.image(file, width=100, caption=name) def display_terrain(): if uploaded_images['terrain']: st.write('**Terrain**') row = [] for name, files in uploaded_images['terrain'].items(): for file in files: row.append(file) if len(row) == 3: st.image(row, width=100 * 3) row = [] if row: st.image(row, width=100 * len(row)) # Last row, if not complete def display_uploaded_images(): st.write("## Uploaded Images") if image_type == 'characters': display_characters() else: display_terrain() st.write("## Uploaded Images Table") # display markdown table from csv file table_md = get_table_from_csv() if table_md: st.markdown(table_md, unsafe_allow_html=True) else: st.write("No images uploaded yet.") while True: time.sleep(20) st.empty() display_images_from_csv() # show uploaded images and save them to file image_type = st.selectbox('Choose image type:', options=['characters', 'terrain']) name = st.text_input('Enter a name for the image:') uploaded_files = st.file_uploader(key="part2", 'Upload image(s)', type=['png', 'jpg'], accept_multiple_files=True) for uploaded_file in uploaded_files: if uploaded_file is not None: # Get actual image file bytes_data = get_image_path(uploaded_file, name, image_type) uploaded_images[image_type].setdefault(name, []) uploaded_images[image_type][name].append(bytes_data) st.image(bytes_data, use_column_width=True) update_csv_file(uploaded_file, name, image_type) display_uploaded_images()