Spaces:
Running
Running
| import streamlit as st | |
| import pandas as pd | |
| import plotly.figure_factory as ff | |
| import random | |
| from datetime import datetime, timedelta | |
| def generate_random_color(): | |
| r = random.randint(0, 255) | |
| g = random.randint(0, 255) | |
| b = random.randint(0, 255) | |
| return f'rgb({r}, {g}, {b})' | |
| st.set_page_config(layout="wide") | |
| st.title("Project Schedule/Gantt Chart Generator") | |
| project_name = st.text_input("Project Name:") | |
| start_date = st.date_input("Project Start Date:", value=datetime.today()) | |
| end_date = st.date_input("Project End Date:", value=datetime.today() + timedelta(days=30)) | |
| num_activities = st.number_input("Number of Activities (Minimum 1):", min_value=1, value=5) | |
| activities = [] # Corrected line 22: Placed outside the loop | |
| for i in range(num_activities): | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| activity_name = st.text_input(f"Activity {i+1} Name:", key=f"name_{i}") | |
| with col2: | |
| activity_duration = st.number_input(f"Activity {i+1} Duration (days):", min_value=1, key=f"duration_{i}") | |
| activities.append({"Task": activity_name, "Duration": activity_duration}) | |
| if st.button("Create Gantt Chart"): | |
| if not project_name: | |
| st.error("Please enter a project name.") | |
| elif any(not activity["Task"] for activity in activities): | |
| st.error("Please enter names for all activities.") | |
| elif start_date > end_date: | |
| st.error("Start date cannot be after end date.") | |
| else: | |
| try: | |
| df = pd.DataFrame(activities) | |
| df['Start'] = pd.to_datetime(start_date) | |
| df['Finish'] = df['Start'] | |
| for i in range(len(df)): | |
| if i > 0: | |
| df.loc[i, 'Start'] = df.loc[i - 1, 'Finish'] | |
| df.loc[i, 'Finish'] = df.loc[i, 'Start'] + pd.to_timedelta(df.loc[i, 'Duration'], unit='D') | |
| df['Start_str'] = df['Start'].dt.strftime('%Y-%m-%d') | |
| df['Finish_str'] = df['Finish'].dt.strftime('%Y-%m-%d') | |
| data = [] | |
| for _, row in df.iterrows(): | |
| data.append(dict(Task=row['Task'], Start=row['Start_str'], Finish=row['Finish_str'])) | |
| fig = ff.create_gantt(data, colors=[generate_random_color() for _ in range(len(df))], | |
| index_col='Task', show_colorbar=False, group_tasks=True, bar_width=0.4, | |
| showgrid_x=True, showgrid_y=True) | |
| fig.update_layout(title_text=f"Gantt Chart for: {project_name}", title_x=0.5, | |
| margin=dict(l=20, r=20, t=60, b=20), | |
| xaxis=dict(range=[start_date, end_date]), | |
| height=600) | |
| fig.update_yaxes(autorange="reversed") | |
| st.plotly_chart(fig, use_container_width=True) | |
| except Exception as e: | |
| st.error(f"An error occurred during chart creation: {e}") |