import gradio as gr from interface.rebalancing_interface import ( input as rebalancing_inputs, output as rebalancing_output, update_output as rebalancing_update_output, examples as rebalancing_examples, component_rows as rebalancing_component_rows, ) from interface.share_price_trend_interface import ( input as share_price_trend_inputs, output as share_price_trend_output, update_output as share_price_trend_update_output, examples as share_price_trend_examples, component_rows as share_price_trend_component_rows, ) from interface.dollar_cost_averaging_interface import ( input as dollar_cost_averaging_inputs, output as dollar_cost_averaging_output, update_output as dollar_cost_averaging_update_output, examples as dollar_cost_averaging_examples, component_rows as dollar_cost_averaging_component_rows, ) from interface.retirement_planning_interface import ( input as retirement_planning_inputs, output as retirement_planning_output, update_output as retirement_update_output, examples as retirement_planning_examples, component_rows as retirement_planning_component_rows, ) tabs_configuration = [ ("πŸš€ Re-Balancing Calculator", rebalancing_inputs, rebalancing_output, rebalancing_update_output, rebalancing_examples, rebalancing_component_rows), ("πŸ“ˆ Share Price Trend", share_price_trend_inputs, share_price_trend_output, share_price_trend_update_output, share_price_trend_examples, share_price_trend_component_rows), ("πŸ“‰ Dollar Cost Averaging Calculator", dollar_cost_averaging_inputs, dollar_cost_averaging_output, dollar_cost_averaging_update_output, dollar_cost_averaging_examples, dollar_cost_averaging_component_rows), ("πŸ’Έ Dividend-Based Retirement Planning", retirement_planning_inputs, retirement_planning_output, retirement_update_output, retirement_planning_examples, retirement_planning_component_rows), ] def initial_load(*args): idx = 0 rebalancing_results = rebalancing_update_output(*args[idx:idx+len(rebalancing_inputs)]) idx += len(rebalancing_inputs) share_price_trend_results = share_price_trend_update_output(*args[idx:idx+len(share_price_trend_inputs)]) idx += len(share_price_trend_inputs) dollar_cost_averaging_results = dollar_cost_averaging_update_output(*args[idx:idx+len(dollar_cost_averaging_inputs)]) idx += len(dollar_cost_averaging_inputs) retirement_results = retirement_update_output(*args[idx:]) return (rebalancing_results, share_price_trend_results, dollar_cost_averaging_results, retirement_results) MARKDOWN = (""" --- **If you find this tool useful and would like to support its development, please consider making a donation. Your support is greatly appreciated!** - [Donate with KakaoPay](https://qr.kakaopay.com/Ej7jF6o7B) --- For any questions or feedback, reach us at: πŸ“§ [cryman38@daum.net](mailto:cryman38@daum.net) --- """) # Helper function to add buttons def clear_buttons(inputs): clear_button = gr.ClearButton(value="Clear") clear_button.click( fn=lambda: [None] * len(inputs), inputs=[], outputs=inputs ) return clear_button def submit_buttons(inputs, update_fn, output): submit_button = gr.Button(value="Run", variant="primary") submit_button.click( fn=update_fn, inputs=inputs, outputs=output ) return submit_button def on_change(inputs, update_ouutput, outputs): for input_component in inputs: input_component.change( fn=update_ouutput, inputs=inputs, outputs=outputs ) def render_components(component_rows): for row in component_rows: if isinstance(row, list): with gr.Row(): for component in row: component.render() else: row.render() def create_tab(tab_name, inputs, outputs, update_fn, examples, component_rows): with gr.Tab(tab_name): with gr.Row(): with gr.Column(elem_classes="input", scale=1): render_components(component_rows) clear_buttons(inputs) submit_buttons(inputs, update_fn, outputs) with gr.Column(scale=3): outputs.render() with gr.Accordion("πŸ‘€ Examples", open=False): gr.Examples(examples=examples, cache_examples=False, inputs=inputs) on_change(inputs, update_fn, outputs) with gr.Blocks(css='style.css') as demo: with gr.Column(elem_id="col-container"): with gr.Tabs(): for tab in tabs_configuration: create_tab(*tab) # render_about_tab() # "Support Us" νƒ­ μΆ”κ°€ with gr.Accordion("🀝 DONATE", open=True): gr.Markdown(MARKDOWN, elem_id="col-container") demo.load( initial_load, inputs=rebalancing_inputs + share_price_trend_inputs + dollar_cost_averaging_inputs + retirement_planning_inputs, outputs=[ rebalancing_output, share_price_trend_output, dollar_cost_averaging_output, retirement_planning_output ] ) demo.launch(share=True)