From ac7fc0d265659394ad1f0f0821eb9d762aeee079 Mon Sep 17 00:00:00 2001 From: trgiangdo Date: Wed, 24 Jul 2024 13:30:39 +0700 Subject: [PATCH 1/5] feat: add warning on standalone mode to put the main code under the __main__ condition --- .../userman/configuration/job-config.md | 15 +++-- .../5_job_execution/index.md | 67 ++++++++++--------- 2 files changed, 45 insertions(+), 37 deletions(-) diff --git a/docs/manuals/userman/configuration/job-config.md b/docs/manuals/userman/configuration/job-config.md index 482fcd4cc..e178c74ad 100644 --- a/docs/manuals/userman/configuration/job-config.md +++ b/docs/manuals/userman/configuration/job-config.md @@ -85,10 +85,11 @@ You can configure the *standalone* mode with the following config: To execute multiple `Job^`s simultaneously, you can set the *max_nb_of_workers* to an integer value greater than 1. That starts each `Job^` in a dedicated process with *max_nb_of_workers* as the limit of concurrent processes that can run simultaneously. +The default value of *max_nb_of_workers* is 2. -!!! note - - The default value of *max_nb_of_workers* is 2. +!!! warning + In *standalone* mode, it's a good practice to protect the main code with the `if __name__ == "__main":` + condition. By doing this, the code will not be re-executed when the subprocesses are spawned. For example, the following configuration will allow Taipy to run up to eight `Job^`s simultaneously: @@ -98,7 +99,9 @@ simultaneously: ```python linenums="1" from taipy import Config - Config.configure_job_executions(mode="standalone", max_nb_of_workers=8) + if __name__ == "__main__": + Config.configure_job_executions(mode="standalone", max_nb_of_workers=8) + ... ``` === "TOML configuration " @@ -106,7 +109,9 @@ simultaneously: ```python linenums="1" from taipy import Config - Config.load("config.toml") + if __name__ == "__main__": + Config.load("config.toml") + ... ``` ```toml linenums="1" title="config.toml" diff --git a/docs/tutorials/scenario_management/5_job_execution/index.md b/docs/tutorials/scenario_management/5_job_execution/index.md index 704467a1e..28d07d857 100644 --- a/docs/tutorials/scenario_management/5_job_execution/index.md +++ b/docs/tutorials/scenario_management/5_job_execution/index.md @@ -14,10 +14,10 @@ Taipy has [different modes](../../../manuals/userman/configuration/job-config.md to execute the code. Changing the execution mode can be useful for running multiple tasks in parallel. -- _standalone_ mode: asynchronous. Jobs can be run in parallel depending on the graph - of execution (if _max_nb_of_workers_ > 1). +- *standalone* mode: asynchronous. Jobs can be run in parallel depending on the graph + of execution (if *max_nb_of_workers* > 1). -- _development_ mode: synchronous. The default execution mode is _development_. +- *development* mode: synchronous. The default execution mode is *development*. We define a configuration and functions to showcase the two execution modes. @@ -37,6 +37,10 @@ def add(nb): This line of code alters the execution mode. Setting it to *standalone* makes Taipy Core work asynchronously. In this configuration, a maximum of two tasks can run simultaneously. +!!! warning + In *standalone* mode, it's a good practice to protect the main code with the `if __name__ == "__main":` + condition. By doing this, the code will not be re-executed when the subprocesses are spawned. + ```python Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) ``` @@ -54,13 +58,13 @@ if __name__=="__main__": time.sleep(30) ``` -Jobs from the two submissions are being executed simultaneously. If `max_nb_of_workers` was greater, we could run multiple scenarios at the same time and multiple tasks of a scenario at the same time. +Jobs from the two submissions are being executed simultaneously. If *max_nb_of_workers* was greater, we could run multiple scenarios at the same time and multiple tasks of a scenario at the same time. -Some options for the _submit_ function exist: +Some options for the *submit* function exist: -- _wait_: if _wait_ is True, the submission waits for the end of all the jobs (if _timeout_ is not defined). +- *wait*: if *wait* is True, the submission waits for the end of all the jobs (if *timeout* is not defined). -- _timeout_: if _wait_ is True, Taipy waits for the end of the submission up to a certain amount of time. +- *timeout*: if *wait* is True, Taipy waits for the end of the submission up to a certain amount of time. ```python if __name__=="__main__": @@ -72,14 +76,13 @@ if __name__=="__main__": # Entire code - ```python -from taipy.core.config import Config -import taipy as tp -import datetime as dt -import pandas as pd import time +import taipy as tp +from taipy.core.config import Config + + # Normal function used by Taipy def double(nb): return nb * 2 @@ -89,32 +92,32 @@ def add(nb): time.sleep(10) return nb + 10 -Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) +if __name__=="__main__": + Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) -# Configuration of Data Nodes -input_cfg = Config.configure_data_node("my_input", default_data=21) -intermediate_cfg = Config.configure_data_node("intermediate", default_data=21) -output_cfg = Config.configure_data_node("my_output") + # Configuration of Data Nodes + input_cfg = Config.configure_data_node("my_input", default_data=21) + intermediate_cfg = Config.configure_data_node("intermediate", default_data=21) + output_cfg = Config.configure_data_node("my_output") -# Configuration of tasks -first_task_cfg = Config.configure_task("double", - double, - input_cfg, - intermediate_cfg) + # Configuration of tasks + first_task_cfg = Config.configure_task("double", + double, + input_cfg, + intermediate_cfg) -second_task_cfg = Config.configure_task("add", - add, - intermediate_cfg, - output_cfg) + second_task_cfg = Config.configure_task("add", + add, + intermediate_cfg, + output_cfg) -# Configuration of scenario -scenario_cfg = Config.configure_scenario(id="my_scenario", - task_configs=[first_task_cfg, - second_task_cfg]) + # Configuration of the scenario + scenario_cfg = Config.configure_scenario(id="my_scenario", + task_configs=[first_task_cfg, + second_task_cfg]) -Config.export("config_07.toml") + Config.export("config.toml") -if __name__=="__main__": tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg) scenario_2 = tp.create_scenario(scenario_cfg) From bd975ea7e2966364d8d198772594fc8929272ba8 Mon Sep 17 00:00:00 2001 From: trgiangdo Date: Wed, 24 Jul 2024 13:48:30 +0700 Subject: [PATCH 2/5] feat: update example with if __name__==__main__: in the main script --- .../data-node-history-example.py | 38 ++-- .../data-node-vizelements-default-behavior.py | 10 +- .../data-integration/data-node-usage.md | 141 +++++++------- docs/manuals/userman/gui/binding.md | 53 +++--- docs/manuals/userman/gui/callbacks.md | 30 +-- docs/manuals/userman/gui/pages/builder.md | 15 +- docs/manuals/userman/gui/pages/html.md | 54 +++--- docs/manuals/userman/gui/pages/index.md | 165 +++++++++-------- .../userman/gui/pages/partial/src/example.py | 26 +-- .../gui/pages/partial/src/example_md.py | 29 +-- docs/manuals/userman/rest/index.md | 5 +- docs/manuals/userman/scheduling/index.md | 142 +++++++------- .../sdm/cycle/code-example/attributes.py | 35 ++-- .../sdm/cycle/code-example/get-by-id.py | 13 +- .../sdm/job/code-example/get-delete.py | 1 + .../sdm/job/code-example/job-creation.py | 1 + .../scenario/code-example/index/attributes.py | 49 ++--- .../scenario/code-example/index/compare.py | 21 ++- .../code-example/index/creation-simple.py | 3 +- .../index/creation-with-params.py | 7 +- .../sdm/scenario/code-example/index/export.py | 9 +- .../code-example/index/get-by-config-id.py | 11 +- .../scenario/code-example/index/get-by-id.py | 5 +- .../sdm/scenario/code-example/index/import.py | 3 +- .../scenario/code-example/index/sequences.py | 17 +- .../sdm/scenario/code-example/index/tag.py | 9 +- .../sdm/scenario/code-example/index/untag.py | 9 +- .../sdm/sequence/code-example/attributes.py | 41 ++-- .../sdm/sequence/code-example/create.py | 13 +- .../sdm/sequence/code-example/get-by-id.py | 7 +- .../sequence/code-example/get-from-parent.py | 13 +- .../code-example/get-parent-scenarios.py | 19 +- .../code-example/submission-creation.py | 1 + .../task/code-example/attribute-example.py | 27 +-- .../sdm/task/code-example/get-all-tasks.py | 17 +- .../code-example/get-entities-by-config-id.py | 13 +- .../sdm/task/code-example/get-parents.py | 21 ++- .../code-example/get-task-by-config-id.py | 11 +- .../sdm/task/code-example/get-task-by-id.py | 9 +- .../scenario-creation-with-params.py | 25 +-- .../scenario-creation/scenario-creation.py | 23 +-- .../userman/versioning/code-example/main.py | 11 +- .../main_with_multiple_changes.py | 11 +- .../code-example/main_with_small_change.py | 11 +- .../1_understanding_gui/src/src.zip | Bin 9588 -> 10675 bytes .../1_understanding_gui/src/step_01.py | 3 +- .../1_understanding_gui/src/step_01.zip | Bin 201 -> 300 bytes .../1_understanding_gui/src/step_02.py | 9 +- .../1_understanding_gui/src/step_02.zip | Bin 533 -> 729 bytes .../1_understanding_gui/src/step_02_tgb.py | 15 +- .../1_understanding_gui/src/step_03.py | 27 +-- .../1_understanding_gui/src/step_03.zip | Bin 852 -> 1029 bytes .../1_understanding_gui/src/step_03_tgb.py | 19 +- .../1_understanding_gui/src/step_04.py | 49 +++-- .../1_understanding_gui/src/step_04.zip | Bin 1276 -> 1456 bytes .../1_understanding_gui/src/step_04_tgb.py | 44 ++--- .../1_understanding_gui/src/step_05.py | 34 ++-- .../1_understanding_gui/src/step_05.zip | Bin 2054 -> 2213 bytes .../1_understanding_gui/src/step_05_tgb.py | 72 +++---- .../1_understanding_gui/src/step_06.py | 79 ++++---- .../1_understanding_gui/src/step_06.zip | Bin 1968 -> 2121 bytes .../1_understanding_gui/src/step_06_tgb.py | 79 ++++---- .../1_understanding_gui/src/step_07.py | 138 +++++++------- .../1_understanding_gui/src/step_07.zip | Bin 2836 -> 2959 bytes .../1_understanding_gui/src/step_07_tgb.py | 130 +++++++------ .../1_understanding_gui/step_01/step_01.md | 3 +- .../1_understanding_gui/step_02/step_02.md | 28 +-- .../1_understanding_gui/step_03/step_03.md | 45 ++--- .../1_understanding_gui/step_04/step_04.md | 26 ++- .../1_understanding_gui/step_05/step_05.md | 104 +++++------ .../1_understanding_gui/step_07/step_07.md | 175 +++++++++--------- .../2_scenario_management_overview/index.md | 40 ++-- .../scenario_management/1_scenarios/index.md | 51 ++--- .../2_the_data_nodes/index.md | 14 +- .../3_skippable_tasks/index.md | 23 +-- .../4_cycles_scopes/index.md | 38 ++-- .../4_cycles_scopes/src/scope_and_cycle.py | 44 ++--- .../4_cycles_scopes/src/scope_and_cycle.zip | Bin 143473 -> 143295 bytes .../src/scope_and_cycle_toml.py | 18 +- .../5_job_execution/src/job_execution.py | 48 ++--- .../5_job_execution/src/job_execution.zip | Bin 1486 -> 1669 bytes .../5_job_execution/src/job_execution_toml.py | 18 +- .../6_scenario_comparison/index.md | 109 ++++++----- .../src/scenario_comparison.py | 74 ++++---- .../7_scenario_subscription/index.md | 85 ++++----- .../src/scenario_subscription.py | 81 ++++---- .../visuals/1_the_on_change_callback/index.md | 61 +++--- .../tutorials/visuals/2_using_tables/index.md | 61 +++--- .../4_long_callbacks/src/long_callbacks.py | 35 ++-- .../4_long_callbacks/src/trigger_update.py | 30 +-- docs/tutorials/visuals/7_multi_user/index.md | 59 +++--- 91 files changed, 1589 insertions(+), 1553 deletions(-) diff --git a/docs/manuals/userman/data-integration/code-example/data-node-history/data-node-history-example.py b/docs/manuals/userman/data-integration/code-example/data-node-history/data-node-history-example.py index 5676117c5..c009959da 100644 --- a/docs/manuals/userman/data-integration/code-example/data-node-history/data-node-history-example.py +++ b/docs/manuals/userman/data-integration/code-example/data-node-history/data-node-history-example.py @@ -1,4 +1,5 @@ import random + import taipy as tp from taipy import Config @@ -6,27 +7,26 @@ def random_value(): return random.randint(0, 100) +if __name__ == "__main__": + # Configure a data node, a tasks and a scenario + int_cfg = Config.configure_data_node("random_val", scope=tp.Scope.GLOBAL, default_data=12) + task_cfg = Config.configure_task("random_task", function=random_value, output=int_cfg) + scenario_cfg = Config.configure_scenario("random_scenario", task_configs=[task_cfg]) -# Configure a data node, a tasks and a scenario -int_cfg = Config.configure_data_node("random_val", scope=tp.Scope.GLOBAL, default_data=12) -task_cfg = Config.configure_task("random_task", function=random_value, output=int_cfg) -scenario_cfg = Config.configure_scenario("random_scenario", task_configs=[task_cfg]) - -# Create a data node along with a scenario. A default value is written automatically -scenario = tp.create_scenario(scenario_cfg) -data_node = scenario.random_val - -# Manually write a new value to the data node -data_node.write(100, editor="John", comment="Manual edition: 100", extra="extra data") + # Create a data node along with a scenario. A default value is written automatically + scenario = tp.create_scenario(scenario_cfg) + data_node = scenario.random_val -# Submit the scenario so that the data node is written again through a job -tp.Core().run() -scenario.submit() + # Manually write a new value to the data node + data_node.write(100, editor="John", comment="Manual edition: 100", extra="extra data") -print(data_node.edits) -# [{'timestamp': datetime.datetime(2024, 5, 14, 20, 12, 27, 652773), 'editor': 'TAIPY', 'comment': 'Default data written.'}, -# {'timestamp': datetime.datetime(2024, 5, 14, 20, 12, 27, 689737), 'editor': 'John', 'comment': 'Manual edition: 100', 'extra': 'extra data'}, -# {'timestamp': datetime.datetime(2024, 5, 14, 20, 12, 27, 856928), 'job_id': 'JOB_random_task_a8031d80-26f7-406e-9b31-33561d0f9ccd'}] + # Submit the scenario so that the data node is written again through a job + tp.Core().run() + scenario.submit() + print(data_node.edits) + # [{'timestamp': datetime.datetime(2024, 5, 14, 20, 12, 27, 652773), 'editor': 'TAIPY', 'comment': 'Default data written.'}, + # {'timestamp': datetime.datetime(2024, 5, 14, 20, 12, 27, 689737), 'editor': 'John', 'comment': 'Manual edition: 100', 'extra': 'extra data'}, + # {'timestamp': datetime.datetime(2024, 5, 14, 20, 12, 27, 856928), 'job_id': 'JOB_random_task_a8031d80-26f7-406e-9b31-33561d0f9ccd'}] -tp.Gui("<|{scenario.random_val}|data_node|>").run() + tp.Gui("<|{scenario.random_val}|data_node|>").run() diff --git a/docs/manuals/userman/data-integration/code-example/data-node-vizelmts/data-node-vizelements-default-behavior.py b/docs/manuals/userman/data-integration/code-example/data-node-vizelmts/data-node-vizelements-default-behavior.py index 51a128847..9c7a543e3 100644 --- a/docs/manuals/userman/data-integration/code-example/data-node-vizelmts/data-node-vizelements-default-behavior.py +++ b/docs/manuals/userman/data-integration/code-example/data-node-vizelmts/data-node-vizelements-default-behavior.py @@ -1,12 +1,14 @@ from datetime import datetime -import taipy -from taipy import Config, Core, Gui, Scope + import pandas as pd -# Creating a data node variable to be bound to the visual element -data_node = None +import taipy +from taipy import Config, Core, Gui, Scope if __name__ == "__main__": + # Creating a data node variable to be bound to the visual element + data_node = None + # Creating various data sources. A CSV file, an integer parameter and a datetime object pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}).to_csv("out.csv") parameter, date = 15, datetime.now() diff --git a/docs/manuals/userman/data-integration/data-node-usage.md b/docs/manuals/userman/data-integration/data-node-usage.md index de8079c6e..ffdb1c1c3 100644 --- a/docs/manuals/userman/data-integration/data-node-usage.md +++ b/docs/manuals/userman/data-integration/data-node-usage.md @@ -45,7 +45,8 @@ part of a scenario. import taipy as tp from my_config import sales_history_cfg - sale_history_datanode = tp.create_global_data_node(sales_history_cfg) + if __name__ == "__main__": + sale_history_datanode = tp.create_global_data_node(sales_history_cfg) ``` !!! warning @@ -73,12 +74,13 @@ passing the data node id as a parameter: import taipy as tp import my_config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - data_node = scenario.sales_history - data_node_retrieved = scenario.sales_history - data_node = tp.get(data_node.id) - # data_node == data_node_retrieved + data_node = scenario.sales_history + data_node_retrieved = scenario.sales_history + data_node = tp.get(data_node.id) + # data_node == data_node_retrieved ``` ## Get data nodes by config_id @@ -92,21 +94,22 @@ can be directly accessed as attributes by using their config_id: import taipy as tp import my_config - # Creating a scenario from a config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Creating a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - # Access the data node 'sales_history' from the scenario - scenario.sales_history + # Access the data node 'sales_history' from the scenario + scenario.sales_history - # Access the sequence 'sales' from the scenario and - # then access the data node 'sales_history' from the sequence - sequence = scenario.sales - sequence.sales_history + # Access the sequence 'sales' from the scenario and + # then access the data node 'sales_history' from the sequence + sequence = scenario.sales + sequence.sales_history - # Access the task 'training' from the sequence and - # then access the data node 'sales_history' from the task - task = sequence.training - task.sales_history + # Access the task 'training' from the sequence and + # then access the data node 'sales_history' from the task + task = sequence.training + task.sales_history ``` Data nodes can be retrieved by using `taipy.get_entities_by_config_id()^` @@ -119,13 +122,14 @@ nodes instantiated from the config_id provided as a parameter. import taipy as tp import my_config - # Create 2 scenarios, which will also create 2 trained_model data nodes. - scenario_1 = tp.create_scenario(my_config.monthly_scenario_cfg) - scenario_2 = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Create 2 scenarios, which will also create 2 trained_model data nodes. + scenario_1 = tp.create_scenario(my_config.monthly_scenario_cfg) + scenario_2 = tp.create_scenario(my_config.monthly_scenario_cfg) - # Get all data nodes by config_id, this will return a list of 2 trained_model data nodes - # created alongside the 2 scenarios. - all_trained_model_dns = tp.get_entities_by_config_id("trained_model") + # Get all data nodes by config_id, this will return a list of 2 trained_model data nodes + # created alongside the 2 scenarios. + all_trained_model_dns = tp.get_entities_by_config_id("trained_model") ``` ## Get all data nodes @@ -139,16 +143,17 @@ directly accessed as attributes: import taipy as tp import my_config - # Creating a scenario from a config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Creating a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - # Access all the data nodes from the scenario - scenario.data_nodes + # Access all the data nodes from the scenario + scenario.data_nodes - # Access the sequence 'sales' from the scenario and - # then access all the data nodes from the sequence - sequence = scenario.sales - sequence.data_nodes + # Access the sequence 'sales' from the scenario and + # then access all the data nodes from the sequence + sequence = scenario.sales + sequence.data_nodes ``` All the data nodes can be retrieved using the method `taipy.get_data_nodes()^` @@ -177,14 +182,15 @@ the type of data node: import taipy as tp import my_config - # Creating a scenario from a config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Creating a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - # Retrieve a data node - data_node = scenario.sales_history + # Retrieve a data node + data_node = scenario.sales_history - # Returns the content stored on the data node - data_node.read() + # Returns the content stored on the data node + data_node.read() ``` To write some data on the data node, like the output of a task, @@ -199,19 +205,20 @@ type) as a parameter and writes it on the data node: import taipy as tp import my_config - # Creating a scenario from a config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Creating a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - # Retrieve a data node - data_node = scenario.sales_history + # Retrieve a data node + data_node = scenario.sales_history - data = [{"product": "a", "qty": "2"}, {"product": "b", "qty": "4"}] + data = [{"product": "a", "qty": "2"}, {"product": "b", "qty": "4"}] - # Writes the dictionary on the data node - data_node.write(data) + # Writes the dictionary on the data node + data_node.write(data) - # Returns the new data stored on the data node - data_retrieved = data_node.read() + # Returns the new data stored on the data node + data_retrieved = data_node.read() ``` ## Pickle @@ -1120,19 +1127,20 @@ existing data. import taipy as tp import my_config - # Creating a scenario from a config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Creating a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - # Retrieve a data node - data_node = scenario.sales_history + # Retrieve a data node + data_node = scenario.sales_history - data = [{"product": "a", "qty": "2"}, {"product": "b", "qty": "4"}] + data = [{"product": "a", "qty": "2"}, {"product": "b", "qty": "4"}] - # Append the dictionary to the data node - data_node.append(data) + # Append the dictionary to the data node + data_node.append(data) - # Returns the new data stored on the data node - data_retrieved = data_node.read() + # Returns the new data stored on the data node + data_retrieved = data_node.read() ``` !!! warning "Supported data node types" @@ -1698,17 +1706,18 @@ To get the parent entities of a data node (scenarios, sequences, or tasks) you c import taipy as tp import my_config - # Create a scenario from a config - scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + if __name__ == "__main__": + # Create a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) - # Retrieve a data node - data_node = scenario.sales_history + # Retrieve a data node + data_node = scenario.sales_history - # Retrieve the parent entities of the data node - parent_entities = data_node.get_parents() - # {'scenarios': [Scenario 1], 'sequences': [Sequence 1], 'tasks': [Task 1]} + # Retrieve the parent entities of the data node + parent_entities = data_node.get_parents() + # {'scenarios': [Scenario 1], 'sequences': [Sequence 1], 'tasks': [Task 1]} - # Retrieve the parent entities of the data node - tp.get_parents(data_node) - # {'scenarios': [Scenario 1], 'sequences': [Sequence 1], 'tasks': [Task 1]} + # Retrieve the parent entities of the data node + tp.get_parents(data_node) + # {'scenarios': [Scenario 1], 'sequences': [Sequence 1], 'tasks': [Task 1]} ``` diff --git a/docs/manuals/userman/gui/binding.md b/docs/manuals/userman/gui/binding.md index ef324b17f..627684a7a 100644 --- a/docs/manuals/userman/gui/binding.md +++ b/docs/manuals/userman/gui/binding.md @@ -6,16 +6,18 @@ change those variable values. Consider the following application: + ```python linenums="1" from taipy import Gui -x = 1234 +if __name__ == "__main__": + x = 1234 -Gui(page=""" + Gui(page=""" # Hello Taipy The variable `x` contains the value <|{x}|>. -""").run() + """).run() ``` When this program runs (and a web browser is directed to the running server), the @@ -108,24 +110,26 @@ to import the global variables if they are not used in the Python code for that from taipy.gui import Gui, Markdown from pages.page import page - navigation = [("/home", "Home"), ("/page", "Expression")] - root_page=""" + if __name__ == "__main__": + navigation = [("/home", "Home"), ("/page", "Expression")] + root_page=""" <|navbar|lov={navigation}|> - """ + """ - home_page="""# Home page + home_page=""" + # Home page ... - """ + """ - base_value = 0 + base_value = 0 - pages={ - "/": Markdown(root_page), - "home": Markdown(home_page), - "page": page - } + pages={ + "/": Markdown(root_page), + "home": Markdown(home_page), + "page": page, + } - Gui(pages=pages).run() + Gui(pages=pages).run() ``` *page* is imported from `pages.page` (that is the file `pages/page.py`) in @@ -208,22 +212,23 @@ defined. from taipy.gui import Gui, Markdown from page import sub_page - navigation = [("/sub_page", "Page")] - def button_pressed(state): ... - root_page="""# Application + if __name__ == "__main__": + navigation = [("/sub_page", "Page")] + + root_page=""" + # Application <|navbar|lov={navigation}|> <|Press for action|button|on_action=button_pressed|> - """ + """ - Gui(pages={ - "/": Markdown(root_page), - "sub_page": sub_page - }).run() - """ + Gui(pages={ + "/": Markdown(root_page), + "sub_page": sub_page + }).run() ``` Here is the code for the *page* module, where *sub_page* is defined: diff --git a/docs/manuals/userman/gui/callbacks.md b/docs/manuals/userman/gui/callbacks.md index a7a2270d0..196196cbc 100644 --- a/docs/manuals/userman/gui/callbacks.md +++ b/docs/manuals/userman/gui/callbacks.md @@ -29,19 +29,20 @@ activates the control in order to change its value. ```py from taipy.gui import Gui - md = """ + def on_change(state, var, val): + if var == "x": + print(f"'x' was changed to: {val}") + + if __name__ == "__main__": + md = """ # Hello Taipy The variable `x` is here: <|{x}|slider|>. - """ - - x = 50 + """ - def on_change(state, var, val): - if var == "x": - print(f"'x' was changed to: {val}") + x = 50 - Gui(page=md).run() + Gui(page=md).run() ``` In the function body, you can check the new value of the variable and decide @@ -91,16 +92,17 @@ the application that the user has activated those controls somehow. ```py from taipy import Gui - md = """ + def on_action(state, id): + print("The button was pressed!") + + if __name__ == "__main__": + md = """ # Hello Taipy Press <|THIS|button|> button. - """ - - def on_action(state, id): - print("The button was pressed!") + """ - Gui(page=md).run() + Gui(page=md).run() ``` The default behavior for these controls is to call the *on_action()* function within your diff --git a/docs/manuals/userman/gui/pages/builder.md b/docs/manuals/userman/gui/pages/builder.md index 64012b14f..41b85ac40 100644 --- a/docs/manuals/userman/gui/pages/builder.md +++ b/docs/manuals/userman/gui/pages/builder.md @@ -24,11 +24,11 @@ Here is an example of how to create a page using the Page Builder: from taipy.gui import Gui import taipy.gui.builder as tgb +if __name__ == "__main__": + with tgb.Page() as page: + # add your visual elements here -with tgb.Page() as page: - # add your visual elements here - -Gui(page).run() + Gui(page).run() ``` Elements are added in the `with` block for the *page* object.
@@ -209,10 +209,11 @@ def on_action(state, id): # Do something... pass -with tgb.Page() as page: - tgb.button("Press me", id="my_button") +if __name__ == "__main__": + with tgb.Page() as page: + tgb.button("Press me", id="my_button") -Gui(page).run() + Gui(page).run() ``` The `button^` does not define its *on_action* property: Taipy looks for an *on_action()* function diff --git a/docs/manuals/userman/gui/pages/html.md b/docs/manuals/userman/gui/pages/html.md index 065d41ee6..b8255fa0f 100644 --- a/docs/manuals/userman/gui/pages/html.md +++ b/docs/manuals/userman/gui/pages/html.md @@ -11,14 +11,17 @@ Creating a page that displays HTML content needs the application to create an in ```python from taipy.gui import Html -html_page = Html(""" +if __name__ == "__main__": + html_page = Html("""

Page title

Any HTML content can be used here. Press -""") + """) + + Gui(page).run() ``` The *html_page* variable holds a page whose content is defined from HTML text. @@ -60,7 +63,8 @@ defined in HTML as follows: ```python linenums="1" from taipy.gui import Gui, Html -page = Html(""" +if __name__ == "__main__": + page = Html(""" @@ -76,9 +80,9 @@ page = Html(""" -""") + """) -Gui(page).run() + Gui(page).run() ``` In line 16, you can spot where the HTML button is created, along with its event handler: the @@ -92,26 +96,26 @@ To fix this problem, you must set the event handler by code when the JavaScript client.
Here is a version of the variable *page* that fixes the problem: -```python linenums="3" -page = Html(""" - - - - Invoking JavaScript - - - -

Sending an alert

- - - -""") +```python linenums="4" + page = Html(""" + + + + Invoking JavaScript + + + +

Sending an alert

+ + + + """) ``` Notice that, in line 18, where the button element is defined, the setting of the event handler has diff --git a/docs/manuals/userman/gui/pages/index.md b/docs/manuals/userman/gui/pages/index.md index 4598d412f..0c72f2edd 100644 --- a/docs/manuals/userman/gui/pages/index.md +++ b/docs/manuals/userman/gui/pages/index.md @@ -38,19 +38,21 @@ Taipy lets you create as many pages as you require with whatever content you nee ```python from taipy import Gui - page = "# First page" + if __name__ == "__main__": + page = "# First page" - Gui(page).run() + Gui(page).run() ``` === "Python" ```python from taipy import Gui import taipy.gui.builder as tgb - with tgb.Page() as page: - tgb.text("# First Page", mode="md") + if __name__ == "__main__": + with tgb.Page() as page: + tgb.text("# First Page", mode="md") - Gui(page).run() + Gui(page).run() ``` ## Defining the page content @@ -68,9 +70,16 @@ The definition of a page typically consists of: from taipy.gui import Gui from math import cos, exp - value = 10 + def slider_moved(state): + state.data = compute_data(state.value) + + def compute_data(decay:int)->list: + return [cos(i/6) * exp(-i*decay/600) for i in range(100)] + + if __name__ == "__main__": + value = 10 - page = """ + page = """ # Taipy *Getting Started* Value: <|{value}|text|> @@ -78,16 +87,8 @@ The definition of a page typically consists of: <|{value}|slider|on_change=slider_moved|> <|{data}|chart|> - """ - - def slider_moved(state): - state.data = compute_data(state.value) + """ - def compute_data(decay:int)->list: - return [cos(i/6) * exp(-i*decay/600) for i in range(100)] - - - if __name__ == "__main__": data = compute_data(value) Gui(page).run(title="Dynamic chart") @@ -99,22 +100,21 @@ The definition of a page typically consists of: import taipy.gui.builder as tgb from math import cos, exp - value = 10 - def compute_data(decay:int)->list: return [cos(i/6) * exp(-i*decay/600) for i in range(100)] def slider_moved(state): state.data = compute_data(state.value) - with tgb.Page() as page: - tgb.text(value="# Taipy Getting Started", mode="md") - tgb.text(value="Value: {value}") - tgb.slider(value="{value}", on_change=slider_moved) - tgb.chart(data="{data}") + if __name__ == "__main__": + value = 10 + with tgb.Page() as page: + tgb.text(value="# Taipy Getting Started", mode="md") + tgb.text(value="Value: {value}") + tgb.slider(value="{value}", on_change=slider_moved) + tgb.chart(data="{data}") - if __name__ == "__main__": data = compute_data(value) Gui(page).run(title="Dynamic chart") @@ -125,28 +125,30 @@ The definition of a page typically consists of: Once you have created an instance of a page renderer for a specific piece of text or Python code, you can register that page to the `Gui^` instance used by your application. -The `Gui^` constructor can accept the raw content of a page as Markdown text, a Page object and -create a new page for you. That would be the easier way to create applications that have a -single page. Here is how you can create and register a page in a +The `Gui^` constructor can accept the raw content of a page as Markdown text, a Page object and +create a new page for you. That would be the easier way to create applications that have a +single page. Here is how you can create and register a page in a Taipy application: === "Markdown" ```python from taipy import Gui - page = "# First page" + if __name__ == "__main__": + page = "# First page" - Gui(page).run() + Gui(page).run() ``` === "Python" ```python from taipy import Gui import taipy.gui.builder as tgb - with tgb.Page() as page: - tgb.text("# First Page", mode="md") + if __name__ == "__main__": + with tgb.Page() as page: + tgb.text("# First Page", mode="md") - Gui(page).run() + Gui(page).run() ``` If you run this Python script and connect a browser to the web server address @@ -164,47 +166,49 @@ associates a page with its name: ```python from taipy import Gui - root_md = "# Multi-page application" - home_md = "# Home" - about_md = "# About" - - pages = { - "/": root_md, - "home": home_md, - "about": about_md - } - - Gui(pages=pages).run() - # or - # gui = Gui() - # gui.add_pages(pages) - # gui.run() + if __name__ == "__main__": + root_md = "# Multi-page application" + home_md = "# Home" + about_md = "# About" + + pages = { + "/": root_md, + "home": home_md, + "about": about_md + } + + Gui(pages=pages).run() + # or + # gui = Gui() + # gui.add_pages(pages) + # gui.run() ``` === "Python" ```python from taipy import Gui import taipy.gui.builder as tgb - with tgb.Page() as root_page: - tgb.text("# Multi-page application", mode="md") + if __name__ == "__main__": + with tgb.Page() as root_page: + tgb.text("# Multi-page application", mode="md") - with tgb.Page() as home_page: - tgb.text("# Home", mode="md") + with tgb.Page() as home_page: + tgb.text("# Home", mode="md") - with tgb.Page() as about_page: - tgb.text("# About", mode="md") + with tgb.Page() as about_page: + tgb.text("# About", mode="md") - pages = { - "/": root_page, - "home": home_page, - "about": about_page - } + pages = { + "/": root_page, + "home": home_page, + "about": about_page + } - Gui(pages=pages).run() - # or - # gui = Gui() - # gui.add_pages(pages) - # gui.run() + Gui(pages=pages).run() + # or + # gui = Gui() + # gui.add_pages(pages) + # gui.run() ``` You could have also used the `(Gui.)add_page()` function. @@ -220,7 +224,7 @@ to visual elements may have a scope limited to their origin module. See ## Root page The *Root* page is the page located at `"/"` (or the value of the -[*base_url*](../../configuration/gui-config.md#p-base_url) configuration setting). +[*base_url*](../../configuration/gui-config.md#p-base_url) configuration setting). The content of the page will be shown at the top of every page of your application. ## Application header and footer @@ -234,26 +238,27 @@ runs. !!! example ```python - from taipy import Gui - - root_md=""" - # Multi-page application + from taipy import Gui - <|content|> + if __name__ == "__main__": + root_md=""" + # Multi-page application - This application was created with [Taipy](https://www.taipy.io/). - """ - home_md="## Home" - about_md="## About" + <|content|> - pages = { - "/": root_md, - "home": home_md, - "about": about_md - } - Gui(pages=pages).run() + This application was created with [Taipy](https://www.taipy.io/). + """ + home_md="## Home" + about_md="## About" + + pages = { + "/": root_md, + "home": home_md, + "about": about_md + } + Gui(pages=pages).run() ``` This application does the same as in the previous example, except that you now have the footer line (*'This application was created...'*) in all the pages of - your application. \ No newline at end of file + your application. diff --git a/docs/manuals/userman/gui/pages/partial/src/example.py b/docs/manuals/userman/gui/pages/partial/src/example.py index 146501494..a2ed77794 100644 --- a/docs/manuals/userman/gui/pages/partial/src/example.py +++ b/docs/manuals/userman/gui/pages/partial/src/example.py @@ -1,8 +1,6 @@ -from taipy.gui import Gui, navigate import taipy.gui.builder as tgb +from taipy.gui import Gui -# Initial links -links = [("Taipy", "http://taipy.io")] # Function to refresh the links partial def refresh_links(state): @@ -27,16 +25,20 @@ def simulate_adding_more_links(state): ] refresh_links(state) -# Define the main page layout -with tgb.Page() as main_page: - tgb.button('Add links', on_action=simulate_adding_more_links) - tgb.part(partial="{link_partial}") - # Initialize the application state def on_init(state): refresh_links(state) -# Create and run the Taipy GUI -gui = Gui(main_page) -link_partial = gui.add_partial("") -gui.run() +if __name__ == "__main__": + # Initial links + links = [("Taipy", "http://taipy.io")] + + # Define the main page layout + with tgb.Page() as main_page: + tgb.button('Add links', on_action=simulate_adding_more_links) + tgb.part(partial="{link_partial}") + + # Create and run the Taipy GUI + gui = Gui(main_page) + link_partial = gui.add_partial("") + gui.run() diff --git a/docs/manuals/userman/gui/pages/partial/src/example_md.py b/docs/manuals/userman/gui/pages/partial/src/example_md.py index e88734159..7aa17e1b1 100644 --- a/docs/manuals/userman/gui/pages/partial/src/example_md.py +++ b/docs/manuals/userman/gui/pages/partial/src/example_md.py @@ -1,8 +1,5 @@ -from taipy.gui import Gui, navigate -import taipy.gui.builder as tgb +from taipy.gui import Gui -# Initial links -links = [("Taipy", "http://taipy.io")] # Function to refresh the links partial def refresh_links(state): @@ -27,17 +24,21 @@ def simulate_adding_more_links(state): ] refresh_links(state) -# Define the main page layout -main_page = """ -<|Add links|button|on_action=simulate_adding_more_links|> -<|part|partial={link_partial}|> -""" - # Initialize the application state def on_init(state): refresh_links(state) -# Create and run the Taipy GUI -gui = Gui(main_page) -link_partial = gui.add_partial("") -gui.run() +if __name__ == "__main__": + # Initial links + links = [("Taipy", "http://taipy.io")] + + # Define the main page layout + main_page = """ +<|Add links|button|on_action=simulate_adding_more_links|> +<|part|partial={link_partial}|> + """ + + # Create and run the Taipy GUI + gui = Gui(main_page) + link_partial = gui.add_partial("") + gui.run() diff --git a/docs/manuals/userman/rest/index.md b/docs/manuals/userman/rest/index.md index 88ae911f2..20cf20b02 100644 --- a/docs/manuals/userman/rest/index.md +++ b/docs/manuals/userman/rest/index.md @@ -38,8 +38,9 @@ To expose the Taipy REST APIs, the Taipy REST server must first be started. ``` python import taipy as tp - rest_service = tp.Rest() - tp.run(rest_service) + if __name__ == "__main__": + rest_service = tp.Rest() + tp.run(rest_service) ``` Below is the output of the previous Python code execution. ``` diff --git a/docs/manuals/userman/scheduling/index.md b/docs/manuals/userman/scheduling/index.md index e3b831f23..98b28b14d 100644 --- a/docs/manuals/userman/scheduling/index.md +++ b/docs/manuals/userman/scheduling/index.md @@ -29,7 +29,8 @@ start the scheduler by using the `start()` method. ```python import taipy as tp -tp.Scheduler.start() +if __name__ == "__main__": + tp.Scheduler.start() ``` Once the scheduler is started, the scheduled methods will run in the @@ -46,7 +47,7 @@ To stop the scheduler from running the scheduled methods, you can use the `stop()` method. ```python -tp.Scheduler.stop() + tp.Scheduler.stop() ``` ## Run a method every specific interval @@ -58,22 +59,23 @@ The interval can be specified in seconds, minutes, hours, days, weeks, days, mon import taipy as tp from my_config import monthly_scenario_cfg -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -# Submit a scenario every 3 second/minute/hour/day -# Starting 3 second/minute/hour/day from now -tp.Scheduler.every(3).seconds.do(tp.submit, monthly_scenario) -tp.Scheduler.every(3).minutes.do(tp.submit, monthly_scenario) -tp.Scheduler.every(3).hours.do(tp.submit, monthly_scenario) -tp.Scheduler.every(3).days.do(tp.submit, monthly_scenario) + # Submit a scenario every 3 second/minute/hour/day + # Starting 3 second/minute/hour/day from now + tp.Scheduler.every(3).seconds.do(tp.submit, monthly_scenario) + tp.Scheduler.every(3).minutes.do(tp.submit, monthly_scenario) + tp.Scheduler.every(3).hours.do(tp.submit, monthly_scenario) + tp.Scheduler.every(3).days.do(tp.submit, monthly_scenario) -# Submit a scenario every 1 week/month/year -# Starting 1 week/month/year from now -tp.Scheduler.every().weeks.do(tp.submit, monthly_scenario) -tp.Scheduler.every().months.do(tp.submit, monthly_scenario) -tp.Scheduler.every().years.do(tp.submit, monthly_scenario) + # Submit a scenario every 1 week/month/year + # Starting 1 week/month/year from now + tp.Scheduler.every().weeks.do(tp.submit, monthly_scenario) + tp.Scheduler.every().months.do(tp.submit, monthly_scenario) + tp.Scheduler.every().years.do(tp.submit, monthly_scenario) -tp.Scheduler.start() + tp.Scheduler.start() ``` In the above example, we schedule the `tp.submit(monthly_scenario)` method with different intervals. @@ -134,37 +136,38 @@ yearly scheduled methods. The `on()` method requires the following parameter: import taipy as tp from my_config import monthly_scenario_cfg -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -# Submit a scenario every minute at the 23rd second -tp.Scheduler.every().minute.at(":23").do(tp.submit, monthly_scenario) + # Submit a scenario every minute at the 23rd second + tp.Scheduler.every().minute.at(":23").do(tp.submit, monthly_scenario) -# Submit a scenario every hour at the 42nd minute -tp.Scheduler.every().hour.at(":42").do(tp.submit, monthly_scenario) + # Submit a scenario every hour at the 42nd minute + tp.Scheduler.every().hour.at(":42").do(tp.submit, monthly_scenario) -# Submit a scenario every 5th hour, 20 minutes and 30 seconds in. -# If current time is 02:00, first execution is at 06:20:30 -tp.Scheduler.every(5).hours.at("20:30").do(tp.submit, monthly_scenario) + # Submit a scenario every 5th hour, 20 minutes and 30 seconds in. + # If current time is 02:00, first execution is at 06:20:30 + tp.Scheduler.every(5).hours.at("20:30").do(tp.submit, monthly_scenario) -# Submit a scenario every day at specific HH:MM and next HH:MM:SS -tp.Scheduler.every().day.at("10:30").do(tp.submit, monthly_scenario) -tp.Scheduler.every().day.at("12:42:30", "Europe/Amsterdam").do(tp.submit, monthly_scenario) + # Submit a scenario every day at specific HH:MM and next HH:MM:SS + tp.Scheduler.every().day.at("10:30").do(tp.submit, monthly_scenario) + tp.Scheduler.every().day.at("12:42:30", "Europe/Amsterdam").do(tp.submit, monthly_scenario) -# Submit a scenario on a specific day of the week -tp.Scheduler.every().monday.do(tp.submit, monthly_scenario) -tp.Scheduler.every().wednesday.at("13:15").do(tp.submit, monthly_scenario) + # Submit a scenario on a specific day of the week + tp.Scheduler.every().monday.do(tp.submit, monthly_scenario) + tp.Scheduler.every().wednesday.at("13:15").do(tp.submit, monthly_scenario) -# Submit a scenario on the 15th of every month -tp.Scheduler.every().months.at("13:15").on("15").do(tp.submit, monthly_scenario) -# Submit a scenario on the last day every 2 months -tp.Scheduler.every(2).months.at("13:15").on("-1").do(tp.submit, monthly_scenario) + # Submit a scenario on the 15th of every month + tp.Scheduler.every().months.at("13:15").on("15").do(tp.submit, monthly_scenario) + # Submit a scenario on the last day every 2 months + tp.Scheduler.every(2).months.at("13:15").on("-1").do(tp.submit, monthly_scenario) -# Submit a scenario on January 3rd every year on Amsterdam timezone -tp.Scheduler.every().years.at("13:15", "Europe/Amsterdam").on("jan 03").do(tp.submit, monthly_scenario) -# Submit a scenario on the last day of February every year -tp.Scheduler.every().years.at("13:15").on("feb -1").do(tp.submit, monthly_scenario) + # Submit a scenario on January 3rd every year on Amsterdam timezone + tp.Scheduler.every().years.at("13:15", "Europe/Amsterdam").on("jan 03").do(tp.submit, monthly_scenario) + # Submit a scenario on the last day of February every year + tp.Scheduler.every().years.at("13:15").on("feb -1").do(tp.submit, monthly_scenario) -tp.Scheduler.start() + tp.Scheduler.start() ``` Once scheduled, the first run of the method is based on the current time and the time specified in the `at()` API. @@ -190,22 +193,23 @@ from datetime import datetime, timedelta, time import taipy as tp from my_config import monthly_scenario_cfg -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -# Submit a scenario until a 18:30 today -tp.Scheduler.every(1).hours.until("18:30").do(tp.submit, monthly_scenario) + # Submit a scenario until a 18:30 today + tp.Scheduler.every(1).hours.until("18:30").do(tp.submit, monthly_scenario) -# Submit a scenario until a 2030-01-01 18:33 -tp.Scheduler.every(1).hours.until("2030-01-01 18:33").do(tp.submit, monthly_scenario) + # Submit a scenario until a 2030-01-01 18:33 + tp.Scheduler.every(1).hours.until("2030-01-01 18:33").do(tp.submit, monthly_scenario) -# Submit a scenario until today 11:33:42 -tp.Scheduler.every(1).hours.until(time(11, 33, 42)).do(tp.submit, monthly_scenario) + # Submit a scenario until today 11:33:42 + tp.Scheduler.every(1).hours.until(time(11, 33, 42)).do(tp.submit, monthly_scenario) -# Submit a scenario for every hour until the next 8 hours -tp.Scheduler.every(1).hours.until(timedelta(hours=8)).do(tp.submit, monthly_scenario) + # Submit a scenario for every hour until the next 8 hours + tp.Scheduler.every(1).hours.until(timedelta(hours=8)).do(tp.submit, monthly_scenario) -# Submit a scenario until a specific datetime -tp.Scheduler.every(1).months.until(datetime(2030, 1, 1, 12, 30, 0)).do(tp.submit, monthly_scenario) + # Submit a scenario until a specific datetime + tp.Scheduler.every(1).months.until(datetime(2030, 1, 1, 12, 30, 0)).do(tp.submit, monthly_scenario) ``` ## Get all scheduled methods @@ -216,11 +220,12 @@ To retrieve all scheduled methods from the scheduler, use `tp.Scheduler.get_sche import taipy as tp from my_config import monthly_scenario_cfg -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -tp.Scheduler.every().second.do(tp.submit, monthly_scenario) + tp.Scheduler.every().second.do(tp.submit, monthly_scenario) -all_scheduled_methods = tp.Scheduler.get_scheduled_methods() + all_scheduled_methods = tp.Scheduler.get_scheduled_methods() ``` The `tp.Scheduler.get_scheduled_methods()` method returns a list of `ScheduledMethod^` objects, which you can use to @@ -234,11 +239,12 @@ To remove a scheduled method from the scheduler, use the `tp.Scheduler.cancel_sc import taipy as tp from my_config import monthly_scenario_cfg -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -monthly_submit_method = tp.Scheduler.every().second.do(tp.submit, monthly_scenario) + monthly_submit_method = tp.Scheduler.every().second.do(tp.submit, monthly_scenario) -tp.Scheduler.cancel_scheduled_method(monthly_submit_method) + tp.Scheduler.cancel_scheduled_method(monthly_submit_method) ``` To remove all scheduled methods from the scheduler, use `tp.Scheduler.clear()` @@ -247,11 +253,12 @@ To remove all scheduled methods from the scheduler, use `tp.Scheduler.clear()` import taipy as tp from my_config import monthly_scenario_cfg -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -tp.Scheduler.every().second.do(tp.submit, monthly_scenario) + tp.Scheduler.every().second.do(tp.submit, monthly_scenario) -tp.Scheduler.clear() + tp.Scheduler.clear() ``` ## Shortcut for scheduling most used Taipy methods @@ -268,16 +275,17 @@ Instead of using the `do()` method and specifying the Taipy method to schedule, import taipy as tp from my_config import monthly_scenario_cfg -# Creating a new scenario every month using the monthly_scenario_cfg -tp.Scheduler.every().months.do_create(monthly_scenario_cfg) +if __name__ == "__main__": + # Creating a new scenario every month using the monthly_scenario_cfg + tp.Scheduler.every().months.do_create(monthly_scenario_cfg) -# Submit the monthly_scenario every month -monthly_scenario = tp.create_scenario(monthly_scenario_cfg) -monthly_submit_method = tp.Scheduler.every().months.do_submit(monthly_scenario) + # Submit the monthly_scenario every month + monthly_scenario = tp.create_scenario(monthly_scenario_cfg) + monthly_submit_method = tp.Scheduler.every().months.do_submit(monthly_scenario) -# Create a new scenario every month using the monthly_scenario_cfg -# and submit it immediately -tp.Scheduler.every().months.do_create_and_submit_scenario(monthly_scenario_cfg) + # Create a new scenario every month using the monthly_scenario_cfg + # and submit it immediately + tp.Scheduler.every().months.do_create_and_submit_scenario(monthly_scenario_cfg) -tp.Scheduler.clear() + tp.Scheduler.clear() ``` diff --git a/docs/manuals/userman/sdm/cycle/code-example/attributes.py b/docs/manuals/userman/sdm/cycle/code-example/attributes.py index 971d99a22..ffad3a643 100644 --- a/docs/manuals/userman/sdm/cycle/code-example/attributes.py +++ b/docs/manuals/userman/sdm/cycle/code-example/attributes.py @@ -1,21 +1,22 @@ -import taipy as tp from datetime import datetime import my_config +import taipy as tp -# Create a scenario using the monthly scenario configuration. -scenario = tp.create_scenario(my_config.monthly_scenario_cfg, - creation_date=datetime(2022, 1, 3)) -cycle = scenario.cycle +if __name__ == "__main__": + # Create a scenario using the monthly scenario configuration. + scenario = tp.create_scenario(my_config.monthly_scenario_cfg, + creation_date=datetime(2022, 1, 3)) + cycle = scenario.cycle -# The frequency is an attribute of the cycle. In the example, it equals -# Frequency.MONTHLY since my_config.monthly_scenario_cfg is used has been -# used to instantiate scenario and cycle. -cycle.frequency -# The creation date is the date-time provided at the creation. It equals datetime(2022, 1, 3) -cycle.creation_date -# The start date is the date-time of the start of the cycle. It equals datetime(2022, 1, 1) -cycle.start_date -# The end date is the date-time of the end of the cycle. It equals datetime(2022, 1, 31) -cycle.end_date -# By default, the `name` is generated. It can be set manually to be displayed in a user interface. -cycle.name = "January cycle" + # The frequency is an attribute of the cycle. In the example, it equals + # Frequency.MONTHLY since my_config.monthly_scenario_cfg is used has been + # used to instantiate scenario and cycle. + cycle.frequency + # The creation date is the date-time provided at the creation. It equals datetime(2022, 1, 3) + cycle.creation_date + # The start date is the date-time of the start of the cycle. It equals datetime(2022, 1, 1) + cycle.start_date + # The end date is the date-time of the end of the cycle. It equals datetime(2022, 1, 31) + cycle.end_date + # By default, the `name` is generated. It can be set manually to be displayed in a user interface. + cycle.name = "January cycle" diff --git a/docs/manuals/userman/sdm/cycle/code-example/get-by-id.py b/docs/manuals/userman/sdm/cycle/code-example/get-by-id.py index 3de89b339..1a8d9c3cd 100644 --- a/docs/manuals/userman/sdm/cycle/code-example/get-by-id.py +++ b/docs/manuals/userman/sdm/cycle/code-example/get-by-id.py @@ -1,11 +1,12 @@ import taipy as tp import my_config -# Create a scenario and the related cycle -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + # Create a scenario and the related cycle + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -# Retrieve the parent cycle of the scenario -cycle = scenario.cycle + # Retrieve the parent cycle of the scenario + cycle = scenario.cycle -# Get the cycle by its id -cycle_retrieved = tp.get(cycle.id) + # Get the cycle by its id + cycle_retrieved = tp.get(cycle.id) diff --git a/docs/manuals/userman/sdm/job/code-example/get-delete.py b/docs/manuals/userman/sdm/job/code-example/get-delete.py index f90c8bd99..6733b3dad 100644 --- a/docs/manuals/userman/sdm/job/code-example/get-delete.py +++ b/docs/manuals/userman/sdm/job/code-example/get-delete.py @@ -1,6 +1,7 @@ import taipy as tp from taipy import Config + def double(nb): return nb * 2 diff --git a/docs/manuals/userman/sdm/job/code-example/job-creation.py b/docs/manuals/userman/sdm/job/code-example/job-creation.py index de6636e65..18379b7c9 100644 --- a/docs/manuals/userman/sdm/job/code-example/job-creation.py +++ b/docs/manuals/userman/sdm/job/code-example/job-creation.py @@ -1,6 +1,7 @@ import taipy as tp from taipy import Config + def double(nb): return nb * 2 diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/attributes.py b/docs/manuals/userman/sdm/scenario/code-example/index/attributes.py index e7e501c1b..c7fe1180b 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/attributes.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/attributes.py @@ -2,28 +2,29 @@ from datetime import datetime import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg, - creation_date=datetime(2022, 1, 1), - name="Scenario for January") +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg, + creation_date=datetime(2022, 1, 1), + name="Scenario for January") -# The config_id is an attribute of the scenario and equals "scenario_configuration" -scenario.config_id -# The creation date is the date-time provided at the creation. It equals datetime(2022, 1, 1) -scenario.creation_date -# The is_primary property equals `True` since it is the only scenario of the cycle. -scenario.is_primary -# There was no subscription, so subscribers is an empty list -scenario.subscribers # [] -# The properties' dictionary equals {"name": "Scenario for January"}. It contains all the properties, -# including the `name` provided at the creation -scenario.properties # {"name": "Scenario for January"} -# The `name` property is also exposed directly as an attribute. It equals "Scenario for January" -scenario.name -# the sales sequence entity is exposed as an attribute of the scenario -sales_sequence = scenario.sales -# the production sequence entity as well -production_sequence = scenario.production -# All the tasks are also exposed as attributes, including the training task entity -training_task = scenario.training -# The six data nodes are also exposed as attributes of the scenario. -current_month_data_node = scenario.current_month + # The config_id is an attribute of the scenario and equals "scenario_configuration" + scenario.config_id + # The creation date is the date-time provided at the creation. It equals datetime(2022, 1, 1) + scenario.creation_date + # The is_primary property equals `True` since it is the only scenario of the cycle. + scenario.is_primary + # There was no subscription, so subscribers is an empty list + scenario.subscribers # [] + # The properties' dictionary equals {"name": "Scenario for January"}. It contains all the properties, + # including the `name` provided at the creation + scenario.properties # {"name": "Scenario for January"} + # The `name` property is also exposed directly as an attribute. It equals "Scenario for January" + scenario.name + # the sales sequence entity is exposed as an attribute of the scenario + sales_sequence = scenario.sales + # the production sequence entity as well + production_sequence = scenario.production + # All the tasks are also exposed as attributes, including the training task entity + training_task = scenario.training + # The six data nodes are also exposed as attributes of the scenario. + current_month_data_node = scenario.current_month diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/compare.py b/docs/manuals/userman/sdm/scenario/code-example/index/compare.py index 149939d61..aeb3397a6 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/compare.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/compare.py @@ -2,16 +2,17 @@ from datetime import datetime from my_config import monthly_scenario_cfg -tp.Core().run() +if __name__ == "__main__": + tp.Core().run() -previous_month_scenario = tp.create_scenario(monthly_scenario_cfg) -previous_month_scenario.current_month.write(datetime(2020, 1, 1)) -previous_month_scenario.submit() + previous_month_scenario = tp.create_scenario(monthly_scenario_cfg) + previous_month_scenario.current_month.write(datetime(2020, 1, 1)) + previous_month_scenario.submit() -current_month_scenario = tp.create_scenario(monthly_scenario_cfg) -current_month_scenario.current_month.write(datetime(2020, 2, 1)) -current_month_scenario.submit() + current_month_scenario = tp.create_scenario(monthly_scenario_cfg) + current_month_scenario.current_month.write(datetime(2020, 2, 1)) + current_month_scenario.submit() -tp.compare_scenarios(previous_month_scenario, - current_month_scenario, - data_node_config_id="sales_predictions") + tp.compare_scenarios(previous_month_scenario, + current_month_scenario, + data_node_config_id="sales_predictions") diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/creation-simple.py b/docs/manuals/userman/sdm/scenario/code-example/index/creation-simple.py index 7a5eef415..bc1a336e5 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/creation-simple.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/creation-simple.py @@ -1,4 +1,5 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/creation-with-params.py b/docs/manuals/userman/sdm/scenario/code-example/index/creation-with-params.py index 4b841657d..66d10a64e 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/creation-with-params.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/creation-with-params.py @@ -2,6 +2,7 @@ import my_config from datetime import datetime -scenario = tp.create_scenario(config=my_config.monthly_scenario_cfg, - creation_date=datetime(2022, 1, 1), - name="Scenario for January") +if __name__ == "__main__": + scenario = tp.create_scenario(config=my_config.monthly_scenario_cfg, + creation_date=datetime(2022, 1, 1), + name="Scenario for January") diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/export.py b/docs/manuals/userman/sdm/scenario/code-example/index/export.py index 80845d5e4..67bb29805 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/export.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/export.py @@ -1,8 +1,9 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -tp.export(scenario.id, output_path="./monthly_scenario.zip", override=True, include_data=True) -# or -scenario.export(output_path="./monthly_scenario_2.zip", override=True, include_data=True) + tp.export(scenario.id, output_path="./monthly_scenario.zip", override=True, include_data=True) + # or + scenario.export(output_path="./monthly_scenario_2.zip", override=True, include_data=True) diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/get-by-config-id.py b/docs/manuals/userman/sdm/scenario/code-example/index/get-by-config-id.py index 0fddc4781..00c85dd63 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/get-by-config-id.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/get-by-config-id.py @@ -1,9 +1,10 @@ import taipy as tp import my_config -# Create 2 scenarios. -scenario_1 = tp.create_scenario(my_config.monthly_scenario_cfg) -scenario_2 = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + # Create 2 scenarios. + scenario_1 = tp.create_scenario(my_config.monthly_scenario_cfg) + scenario_2 = tp.create_scenario(my_config.monthly_scenario_cfg) -# Get all monthly scenarios by config id, this will return a list of 2 scenarios just created. -all_monthly_scenarios = tp.get_entities_by_config_id("scenario_configuration") + # Get all monthly scenarios by config id, this will return a list of 2 scenarios just created. + all_monthly_scenarios = tp.get_entities_by_config_id("scenario_configuration") diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/get-by-id.py b/docs/manuals/userman/sdm/scenario/code-example/index/get-by-id.py index 232e40b67..428763381 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/get-by-id.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/get-by-id.py @@ -1,5 +1,6 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -scenario_retrieved = tp.get(scenario.id) +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + scenario_retrieved = tp.get(scenario.id) diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/import.py b/docs/manuals/userman/sdm/scenario/code-example/index/import.py index d10635e0d..674147ad8 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/import.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/import.py @@ -1,3 +1,4 @@ import taipy as tp -imported_scenario = tp.import_scenario(input_path="./monthly_scenario.zip", override=True) +if __name__ == "__main__": + imported_scenario = tp.import_scenario(input_path="./monthly_scenario.zip", override=True) diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/sequences.py b/docs/manuals/userman/sdm/scenario/code-example/index/sequences.py index d11ada2b2..3445015a6 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/sequences.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/sequences.py @@ -1,12 +1,13 @@ import taipy as tp from my_config import monthly_scenario_cfg -scenario = tp.create_scenario(monthly_scenario_cfg) -tasks = scenario.tasks -training_task, predicting_task, planning_task = tasks["training_cfg"], tasks["predicting_cfg"], tasks["planning_cfg"] -scenario.add_sequences({"sales": [training_task, predicting_task], "production": [planning_task]}) +if __name__ == "__main__": + scenario = tp.create_scenario(monthly_scenario_cfg) + tasks = scenario.tasks + training_task, predicting_task, planning_task = tasks["training_cfg"], tasks["predicting_cfg"], tasks["planning_cfg"] + scenario.add_sequences({"sales": [training_task, predicting_task], "production": [planning_task]}) -# and you can remove sequence -scenario.remove_sequences("sales") -# or -scenario.remove_sequences(["sales", "production"]) + # and you can remove sequence + scenario.remove_sequences("sales") + # or + scenario.remove_sequences(["sales", "production"]) diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/tag.py b/docs/manuals/userman/sdm/scenario/code-example/index/tag.py index b23c1f555..0d1994e51 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/tag.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/tag.py @@ -1,8 +1,9 @@ import taipy as tp from my_config import monthly_scenario_cfg -scenario = tp.create_scenario(monthly_scenario_cfg) +if __name__ == "__main__": + scenario = tp.create_scenario(monthly_scenario_cfg) -tp.tag(scenario, "my_tag") -# or -scenario.add_tag("a_second_tag") + tp.tag(scenario, "my_tag") + # or + scenario.add_tag("a_second_tag") diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/untag.py b/docs/manuals/userman/sdm/scenario/code-example/index/untag.py index bf1862c4e..c1359d1d2 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/untag.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/untag.py @@ -1,7 +1,8 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -tp.untag(scenario, "my_tag") -# or -scenario.remove_tag("a_second_tag") +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + tp.untag(scenario, "my_tag") + # or + scenario.remove_tag("a_second_tag") diff --git a/docs/manuals/userman/sdm/sequence/code-example/attributes.py b/docs/manuals/userman/sdm/sequence/code-example/attributes.py index a4a7b508a..b30fdd257 100644 --- a/docs/manuals/userman/sdm/sequence/code-example/attributes.py +++ b/docs/manuals/userman/sdm/sequence/code-example/attributes.py @@ -1,29 +1,30 @@ import taipy as tp import my_config -# Create a scenario -scenario = tp.create_scenario(my_config.monthly_scenario_cfg, - name="Monthly scenario") -# Get the sequence created along with the scenario -sales_sequence = scenario.sales_sequence -sales_sequence.name = "Sequence for sales prediction" +if __name__ == "__main__": + # Create a scenario + scenario = tp.create_scenario(my_config.monthly_scenario_cfg, + name="Monthly scenario") + # Get the sequence created along with the scenario + sales_sequence = scenario.sales_sequence + sales_sequence.name = "Sequence for sales prediction" -# There was no subscription, so subscribers is an empty list -sales_sequence.subscribers # [] + # There was no subscription, so subscribers is an empty list + sales_sequence.subscribers # [] -# The properties dictionary equals {"name": "Sequence for sales prediction"}. It -# contains all the properties, including the `name` provided at the creation -sales_sequence.properties # {"name": "Sequence for sales prediction"} + # The properties dictionary equals {"name": "Sequence for sales prediction"}. It + # contains all the properties, including the `name` provided at the creation + sales_sequence.properties # {"name": "Sequence for sales prediction"} -# The `name` property is also exposed directly as an attribute. It -# equals "Sequence for sales prediction" -sales_sequence.name + # The `name` property is also exposed directly as an attribute. It + # equals "Sequence for sales prediction" + sales_sequence.name -# The training task entity is exposed as an attribute of the sequence -training_task = sales_sequence.training + # The training task entity is exposed as an attribute of the sequence + training_task = sales_sequence.training -# The predicting task entity as well -predicting_task = sales_sequence.predicting + # The predicting task entity as well + predicting_task = sales_sequence.predicting -# The data nodes are also exposed as attributes of the sequence. -current_month_data_node = sales_sequence.current_month + # The data nodes are also exposed as attributes of the sequence. + current_month_data_node = sales_sequence.current_month diff --git a/docs/manuals/userman/sdm/sequence/code-example/create.py b/docs/manuals/userman/sdm/sequence/code-example/create.py index 5e2742c16..e28e4dca9 100644 --- a/docs/manuals/userman/sdm/sequence/code-example/create.py +++ b/docs/manuals/userman/sdm/sequence/code-example/create.py @@ -1,10 +1,11 @@ import taipy as tp import my_config -# Create a scenario from the monthly scenario configuration -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -# Get the training task from the scenario -training_task = scenario.training +if __name__ == "__main__": + # Create a scenario from the monthly scenario configuration + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + # Get the training task from the scenario + training_task = scenario.training -# Add a new sequence made of one single task: the training task -sequence = scenario.add_sequence(name="training_sequence", tasks=[training_task]) + # Add a new sequence made of one single task: the training task + sequence = scenario.add_sequence(name="training_sequence", tasks=[training_task]) diff --git a/docs/manuals/userman/sdm/sequence/code-example/get-by-id.py b/docs/manuals/userman/sdm/sequence/code-example/get-by-id.py index 92c86273c..91bc6d9dd 100644 --- a/docs/manuals/userman/sdm/sequence/code-example/get-by-id.py +++ b/docs/manuals/userman/sdm/sequence/code-example/get-by-id.py @@ -1,7 +1,8 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -sequence = scenario.sales_sequence +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + sequence = scenario.sales_sequence -sequence_retrieved = tp.get(sequence.id) + sequence_retrieved = tp.get(sequence.id) diff --git a/docs/manuals/userman/sdm/sequence/code-example/get-from-parent.py b/docs/manuals/userman/sdm/sequence/code-example/get-from-parent.py index d838136db..7ca79d72b 100644 --- a/docs/manuals/userman/sdm/sequence/code-example/get-from-parent.py +++ b/docs/manuals/userman/sdm/sequence/code-example/get-from-parent.py @@ -1,10 +1,11 @@ import taipy as tp import my_config -# Create a scenario from the monthly scenario configuration -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + # Create a scenario from the monthly scenario configuration + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -# Get the sequences from the scenario -# sequences contains two sequences, as described in the monthly -# scenario configuration -sequences = scenario.sequences + # Get the sequences from the scenario + # sequences contains two sequences, as described in the monthly + # scenario configuration + sequences = scenario.sequences diff --git a/docs/manuals/userman/sdm/sequence/code-example/get-parent-scenarios.py b/docs/manuals/userman/sdm/sequence/code-example/get-parent-scenarios.py index 4eb67cd80..e9d4f9931 100644 --- a/docs/manuals/userman/sdm/sequence/code-example/get-parent-scenarios.py +++ b/docs/manuals/userman/sdm/sequence/code-example/get-parent-scenarios.py @@ -1,15 +1,16 @@ import taipy as tp import my_config -# Create a scenario from a config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg, - name="Scenario 1") +if __name__ == "__main__": + # Create a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg, + name="Scenario 1") -# Retrieve a sequence -sequence = scenario.sales_sequence_cfg + # Retrieve a sequence + sequence = scenario.sales_sequence_cfg -# Retrieve the parent entities of the sequence -parent_entities = sequence.get_parents() # {'scenarios': [Scenario 1]} + # Retrieve the parent entities of the sequence + parent_entities = sequence.get_parents() # {'scenarios': [Scenario 1]} -# Retrieve the parent entities of the sequence -tp.get_parents(sequence) # {'scenarios': [Scenario 1]} + # Retrieve the parent entities of the sequence + tp.get_parents(sequence) # {'scenarios': [Scenario 1]} diff --git a/docs/manuals/userman/sdm/submission/code-example/submission-creation.py b/docs/manuals/userman/sdm/submission/code-example/submission-creation.py index 715257523..9d878e91d 100644 --- a/docs/manuals/userman/sdm/submission/code-example/submission-creation.py +++ b/docs/manuals/userman/sdm/submission/code-example/submission-creation.py @@ -1,6 +1,7 @@ import taipy as tp from taipy import Config + def double(nb): return nb * 2 diff --git a/docs/manuals/userman/sdm/task/code-example/attribute-example.py b/docs/manuals/userman/sdm/task/code-example/attribute-example.py index 3ed27a5a6..2fe7cfa33 100644 --- a/docs/manuals/userman/sdm/task/code-example/attribute-example.py +++ b/docs/manuals/userman/sdm/task/code-example/attribute-example.py @@ -1,21 +1,22 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -task = scenario.predicting +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + task = scenario.predicting -# the config_id is an attribute of the task. Here it equals "predicting" -task.config_id + # the config_id is an attribute of the task. Here it equals "predicting" + task.config_id -# the function to be executed with data from input data -# nodes and returns value for output data nodes. -task.function # predict + # the function to be executed with data from input data + # nodes and returns value for output data nodes. + task.function # predict -# input is the list of input data nodes of the task -task.input # [trained_model_cfg, current_month_cfg] + # input is the list of input data nodes of the task + task.input # [trained_model_cfg, current_month_cfg] -# output is the list of output data nodes of the task -task.output # [sales_predictions_cfg] + # output is the list of output data nodes of the task + task.output # [sales_predictions_cfg] -# the current_month data node entity is exposed as an attribute of the task -current_month_data_node = task.current_month + # the current_month data node entity is exposed as an attribute of the task + current_month_data_node = task.current_month diff --git a/docs/manuals/userman/sdm/task/code-example/get-all-tasks.py b/docs/manuals/userman/sdm/task/code-example/get-all-tasks.py index 91c298ca1..d6ab55316 100644 --- a/docs/manuals/userman/sdm/task/code-example/get-all-tasks.py +++ b/docs/manuals/userman/sdm/task/code-example/get-all-tasks.py @@ -1,13 +1,14 @@ import taipy as tp import my_config -# Creating a scenario from a config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + # Creating a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -# Access all the tasks from the scenario -scenario.tasks + # Access all the tasks from the scenario + scenario.tasks -# Access the sequence 'sales' from the scenario and -# then access all the tasks from the sequence -sequence = scenario.sales -sequence.tasks + # Access the sequence 'sales' from the scenario and + # then access all the tasks from the sequence + sequence = scenario.sales + sequence.tasks diff --git a/docs/manuals/userman/sdm/task/code-example/get-entities-by-config-id.py b/docs/manuals/userman/sdm/task/code-example/get-entities-by-config-id.py index 2bcbf9714..c2ca95141 100644 --- a/docs/manuals/userman/sdm/task/code-example/get-entities-by-config-id.py +++ b/docs/manuals/userman/sdm/task/code-example/get-entities-by-config-id.py @@ -1,10 +1,11 @@ import taipy as tp import my_config -# Create 2 scenarios, which will also create 2 trainig tasks. -scenario_1 = tp.create_scenario(my_config.monthly_scenario_cfg) -scenario_2 = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + # Create 2 scenarios, which will also create 2 trainig tasks. + scenario_1 = tp.create_scenario(my_config.monthly_scenario_cfg) + scenario_2 = tp.create_scenario(my_config.monthly_scenario_cfg) -# Get all training tasks by config id, this will return a list of 2 training tasks -# created alongside the 2 scenarios. -all_training_tasks = tp.get_entities_by_config_id("training") + # Get all training tasks by config id, this will return a list of 2 training tasks + # created alongside the 2 scenarios. + all_training_tasks = tp.get_entities_by_config_id("training") diff --git a/docs/manuals/userman/sdm/task/code-example/get-parents.py b/docs/manuals/userman/sdm/task/code-example/get-parents.py index 686fe7540..f0adfd53c 100644 --- a/docs/manuals/userman/sdm/task/code-example/get-parents.py +++ b/docs/manuals/userman/sdm/task/code-example/get-parents.py @@ -1,16 +1,17 @@ import taipy as tp import my_config -# Create a scenario from a config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) +if __name__ == "__main__": + # Create a scenario from a config + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -# Retrieve a task -task = scenario.training_cfg + # Retrieve a task + task = scenario.training_cfg -# Retrieve the parent entities of the task. The returned value is -# {'scenarios': [Scenario 1], 'sequences': [Sequence 1]} -parent_entities = task.get_parents() + # Retrieve the parent entities of the task. The returned value is + # {'scenarios': [Scenario 1], 'sequences': [Sequence 1]} + parent_entities = task.get_parents() -# Retrieve the parent entities of the task. The return value is -# {'scenarios': [Scenario 1], 'sequences': [Sequence 1]} -tp.get_parents(task) + # Retrieve the parent entities of the task. The return value is + # {'scenarios': [Scenario 1], 'sequences': [Sequence 1]} + tp.get_parents(task) diff --git a/docs/manuals/userman/sdm/task/code-example/get-task-by-config-id.py b/docs/manuals/userman/sdm/task/code-example/get-task-by-config-id.py index e78b564c9..a3dc7c7d5 100644 --- a/docs/manuals/userman/sdm/task/code-example/get-task-by-config-id.py +++ b/docs/manuals/userman/sdm/task/code-example/get-task-by-config-id.py @@ -1,8 +1,9 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -task_1 = scenario.predicting # "predicting" is the config_id of the task -sequence = scenario.sales -task_2 = sequence.predicting # "predicting" is the config_id of the task -# task_1 == task_2 +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + task_1 = scenario.predicting # "predicting" is the config_id of the task + sequence = scenario.sales + task_2 = sequence.predicting # "predicting" is the config_id of the task + # task_1 == task_2 diff --git a/docs/manuals/userman/sdm/task/code-example/get-task-by-id.py b/docs/manuals/userman/sdm/task/code-example/get-task-by-id.py index b0b5987a9..57668110e 100644 --- a/docs/manuals/userman/sdm/task/code-example/get-task-by-id.py +++ b/docs/manuals/userman/sdm/task/code-example/get-task-by-id.py @@ -1,7 +1,8 @@ import taipy as tp import my_config -scenario = tp.create_scenario(my_config.monthly_scenario_cfg) -task = scenario.training -task_retrieved = tp.get(task.id) -# task == task_retrieved +if __name__ == "__main__": + scenario = tp.create_scenario(my_config.monthly_scenario_cfg) + task = scenario.training + task_retrieved = tp.get(task.id) + # task == task_retrieved diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation-with-params.py b/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation-with-params.py index 524ef09a3..ec09f1b50 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation-with-params.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation-with-params.py @@ -1,23 +1,24 @@ -import taipy as tp import datetime +import taipy as tp from taipy import Config def double(nb): return nb * 2 -# Configuring a scenario with a single task that doubles the input data node -input_data_node_cfg = Config.configure_data_node("my_input", default_data=21) -output_data_node_cfg = Config.configure_data_node("my_output") +if __name__ == "__main__": + # Configuring a scenario with a single task that doubles the input data node + input_data_node_cfg = Config.configure_data_node("my_input", default_data=21) + output_data_node_cfg = Config.configure_data_node("my_output") -double_task_cfg = Config.configure_task(id="double_task", - function=double, - input=input_data_node_cfg, - output=output_data_node_cfg) + double_task_cfg = Config.configure_task(id="double_task", + function=double, + input=input_data_node_cfg, + output=output_data_node_cfg) -scenario_cfg = Config.configure_scenario(id="double_scenario", - task_configs=[double_task_cfg]) + scenario_cfg = Config.configure_scenario(id="double_scenario", + task_configs=[double_task_cfg]) -# Instantiating a scenario -scenario = tp.create_scenario(scenario_cfg, datetime.datetime(1998, 7, 12), "My first scenario") + # Instantiating a scenario + scenario = tp.create_scenario(scenario_cfg, datetime.datetime(1998, 7, 12), "My first scenario") diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation.py b/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation.py index ef5fde65d..890393175 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-creation/scenario-creation.py @@ -5,18 +5,19 @@ def double(nb): return nb * 2 -# Configuring a scenario with a single task that doubles the input data node -input_data_node_cfg = Config.configure_data_node("my_input", default_data=21) -output_data_node_cfg = Config.configure_data_node("my_output") +if __name__ == "__main__": + # Configuring a scenario with a single task that doubles the input data node + input_data_node_cfg = Config.configure_data_node("my_input", default_data=21) + output_data_node_cfg = Config.configure_data_node("my_output") -double_task_cfg = Config.configure_task(id="double_task", - function=double, - input=input_data_node_cfg, - output=output_data_node_cfg) + double_task_cfg = Config.configure_task(id="double_task", + function=double, + input=input_data_node_cfg, + output=output_data_node_cfg) -scenario_cfg = Config.configure_scenario(id="double_scenario", - task_configs=[double_task_cfg]) + scenario_cfg = Config.configure_scenario(id="double_scenario", + task_configs=[double_task_cfg]) -# Instantiating a scenario -scenario = tp.create_scenario(scenario_cfg) + # Instantiating a scenario + scenario = tp.create_scenario(scenario_cfg) diff --git a/docs/manuals/userman/versioning/code-example/main.py b/docs/manuals/userman/versioning/code-example/main.py index 0dd4223e3..0b95dfebe 100644 --- a/docs/manuals/userman/versioning/code-example/main.py +++ b/docs/manuals/userman/versioning/code-example/main.py @@ -6,13 +6,12 @@ def example_algorithm(entry: str): # does nothing! return entry - -input_cfg = Config.configure_data_node("my_input", default_data="a_string") -output_cfg = Config.configure_data_node("my_output") -task_cfg = Config.configure_task("example_algorithm", example_algorithm, input_cfg, output_cfg) -scenario_cfg = Config.configure_scenario("my_scenario", [task_cfg]) - if __name__ == "__main__": + input_cfg = Config.configure_data_node("my_input", default_data="a_string") + output_cfg = Config.configure_data_node("my_output") + task_cfg = Config.configure_task("example_algorithm", example_algorithm, input_cfg, output_cfg) + scenario_cfg = Config.configure_scenario("my_scenario", [task_cfg]) + tp.Core().run() tp.create_scenario(scenario_cfg) print(f"Number of scenarios: {len(tp.get_scenarios())}") diff --git a/docs/manuals/userman/versioning/code-example/main_with_multiple_changes.py b/docs/manuals/userman/versioning/code-example/main_with_multiple_changes.py index cb8860327..a439e5487 100644 --- a/docs/manuals/userman/versioning/code-example/main_with_multiple_changes.py +++ b/docs/manuals/userman/versioning/code-example/main_with_multiple_changes.py @@ -6,13 +6,12 @@ def example_algorithm(entry: str): # does nothing! return entry - -input_cfg = Config.configure_data_node("my_input", path="input.pkl", scope=Scope.GLOBAL, default_data="A string") -output_cfg = Config.configure_data_node("my_output", path="output.pkl", scope=Scope.GLOBAL) -task_cfg = Config.configure_task("example_algorithm", example_algorithm, input_cfg, output_cfg, skippable=True) -scenario_cfg = Config.configure_scenario("my_scenario", [task_cfg]) - if __name__ == "__main__": + input_cfg = Config.configure_data_node("my_input", path="input.pkl", scope=Scope.GLOBAL, default_data="A string") + output_cfg = Config.configure_data_node("my_output", path="output.pkl", scope=Scope.GLOBAL) + task_cfg = Config.configure_task("example_algorithm", example_algorithm, input_cfg, output_cfg, skippable=True) + scenario_cfg = Config.configure_scenario("my_scenario", [task_cfg]) + tp.Core().run() tp.create_scenario(scenario_cfg) print(f"Number of scenarios: {len(tp.get_scenarios())}") diff --git a/docs/manuals/userman/versioning/code-example/main_with_small_change.py b/docs/manuals/userman/versioning/code-example/main_with_small_change.py index efab0a815..413205f3e 100644 --- a/docs/manuals/userman/versioning/code-example/main_with_small_change.py +++ b/docs/manuals/userman/versioning/code-example/main_with_small_change.py @@ -6,13 +6,12 @@ def example_algorithm(entry: str): # does nothing! return entry - -input_cfg = Config.configure_data_node("my_input", default_data="a_string") -output_cfg = Config.configure_data_node("my_output", description="What a description") -task_cfg = Config.configure_task("example_algorithm", example_algorithm, input_cfg, output_cfg) -scenario_cfg = Config.configure_scenario("my_scenario", [task_cfg]) - if __name__ == "__main__": + input_cfg = Config.configure_data_node("my_input", default_data="a_string") + output_cfg = Config.configure_data_node("my_output", description="What a description") + task_cfg = Config.configure_task("example_algorithm", example_algorithm, input_cfg, output_cfg) + scenario_cfg = Config.configure_scenario("my_scenario", [task_cfg]) + tp.Core().run() tp.create_scenario(scenario_cfg) print(f"Number of scenarios: {len(tp.get_scenarios())}") diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/src.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/src.zip index 8b24557e7f62184a4ac3304424e1c9a961569b57..d86a291206095dc11834e66f2d2de09c6f61a87e 100644 GIT binary patch literal 10675 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 YXDQ0Sg8UQ$0u}W70Ad0v75LNt15f=zUjP6A literal 9588 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 diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_01.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_01.py index e625f87ea..0d5eee3d4 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_01.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_01.py @@ -1,3 +1,4 @@ from taipy import Gui -Gui(page="# Getting started with *Taipy*").run(debug=True) +if __name__ == "__main__": + Gui(page="# Getting started with *Taipy*").run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_01.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_01.zip index 0df18f0630b47fa6fc9e1eed1af5e95e4225c781..a31133b4095cbc9f27c0040b45ec006aab344ae7 100644 GIT binary patch literal 300 zcmWIWW@Zs#-~ht+K0hKDpr8;)b1^6|6qlqH#2Xmu6;y_X@G`I`WiCid24WChTEWf0 z$nuqufdQzWfkE_)Az!lrkK04r@>&ZDvypBchT+owV#)l-wJ)O z=55=wvYE+mrJCj`tcq#j&{Px>z2+q{yk_5t4P9GcNHtkZxtg4`J3&B!FejBr1)9LW7Ju%r>hBHlLv-mGjO O9gIK-3Y2{y4g&ze6IdVs literal 201 zcmWIWW@Zs#U|`^2nAQ>%an1dMc`%R{3dCGMTwIb`5N}|pS5WD#ed>IuhUXcb6(J|i z=$_Em3M|k+`{e1Pr%XXoter1cZu2_D^=_rA>deZQTt`(qT~$|Vay^}?D#;b4s1O_F zHLJ>XX{D6rO3$S)w<)?VT{&w{3`2l7Ba;XNZp(r8GcYnJfG8k9I3>WFl?^1q2!s|u Jx*Eh`005)@IAj0- diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_02.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_02.py index c31cbd0bf..64a9a2979 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_02.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_02.py @@ -1,13 +1,14 @@ from taipy.gui import Gui -text = "Original text" +if __name__ == "__main__": + text = "Original text" -page = """ + page = """ # Getting started with Taipy GUI My text: <|{text}|> <|{text}|input|> -""" + """ -Gui(page).run(debug=True) \ No newline at end of file + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_02.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_02.zip index eb6945630c38b06e571053d3ed1077b4752aa7a9..d2a7ddfa186210018066709792c0f09f1e5c987b 100644 GIT binary patch literal 729 zcmWIWW@Zs#-~dAHpdS$oP@vDqz`)0#z))P0S`cqw6kn2_q*qWG8p6xK?o_lO4TeiA zxEUB(z5*2k&0t{2?LW`eY`}BueQno;Sdlh zFwNU(-~H+KPnH=PY*?1LGH1!E{x1d+4(AVS6L*%l>(6@YgV`hjlZK!;>kzJ4Y)gXt zCWm`nV+u0ZClT~p=)|P!{aY1}uCncXUs+RnRjk`ce|FGT$?)P!M)4<@x18{~cj%0j z!K|})o=#q{ckUCxI~f}$o;&fW|Novf-Psk-zj&VEQ?ftm^7iPLxQXvIR}0i8Zs_0k z(&c;Q0L*VECq3|v)kL>20z#>%lPk%oytkCPTfk;Py3dYZ23K-#&~A*roR%C zGas^p{9J2g^kxpwS0JAScr!AIFe4HKa(I9e1Pm-`1hGg<9>`{cLKN9vP>907l16Dp YxYAl|@8ub|Sl&yeqs0gvluq2DtGt)@y&%HQs%HA) zNBb8|>DIU{v^G+H#g@f+JC>|E9^ILHob|PQ0Nlk5fu#{bv3%-lLGEW{VBkZzIKCu3 z3FzwB{)1dVSGT=y-sikxI^Pn0gBz6<0=8$^Uu3Lhyxptk+WzC6nRCdSrHc2zPku7z z7(+@y)Ryxc63Yw)OC(*tuCou|mt22M)xdayyo;( - -<|{text}|input|> - -<|Run local|button|on_action=on_button_action|> -""" def on_button_action(state): notify(state, 'info', f'The text is: {state.text}') @@ -22,5 +10,18 @@ def on_change(state, var_name, var_value): state.text = "" return +if __name__ == "__main__": + text = "Original text" + + # Definition of the page + page = """ +# Getting started with Taipy GUI + +My text: <|{text}|> + +<|{text}|input|> + +<|Run local|button|on_action=on_button_action|> + """ -Gui(page).run(debug=True) + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_03.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_03.zip index 6fd20dcff23fd32682afc2ef8b11058f5fd3f0ad..3982384d4bef2e50f0a9698e14d3df1347dee45b 100644 GIT binary patch literal 1029 zcmWIWW@Zs#-~d9updS$oP%wdsfq{=ffuXo0wIJTWIKCu3Nw1(XG=!Idy|rjT8Vr|K za5FHnd}U-{0Gh$TkQ;P1ui1cS-)E7qDh8D!%ps4Ad{>pt2n)Sy$#pcqd%}VTC99Y1 z{XOZzp?^CZ_U)IrZPIhhXv3n9QDuFnZUx?7z-r1^UV16Yc#X~lo%@zr4${lM%~J7f z)|JrBKK>^D)sd7EvyDk-wsZbS4?7pYsQL2R64os*KlU8>an9kgn4MB=+voII?)SSK zSRW}qJAChvNuu(!YX9`5)_a!6PnjCUyM2B4tGj!-vc!e7=8G4xYTR9OszbiONo@1; ze9@$Xx|=pzdDg7!SsCQEe@e5G?o-`Ic{LlaObn}KsrlM?`+)McC7LBXKHP7ljaKm~ z|8%S2GuHSnck+|L!~<(vS@l{{lbEej)b6$>=_VV`?oZ6yP+cp;%CqdC7ft$FJ48c?aw2H+|5r%$$2pYE5jo z?ArMupI8ID**TI=cX5UQ0~r)60r2>G6M~2@HJ}U^BEDd8m0P|bEgy(MG+JDx1|G~h zY{0Ykx3)`_2lrC>fNQeH7Q8Vq^C~yXQ(oTW!q<0at;z52H~nTGeAfL`egE?Id0*GD z8eWMFD^*yqtvD`0I)n2~%NtkC(1onWe+jreO6_y%d%joV;L#{Yo5$w`qntc*Vt2Ac zzw_s4if6jA{^6|KtH1oy6QB9L`v6gv;K+HJiIi~jA_P`k63<-C_`?A*|;=W5nQJFofb`^c~6bBOS4 zHRg-8ug*S@)HPh%+qhYwP;u@`L-XK?>S9@J(ISfLCQIr^98^Ea`At*&M%^BbuT>{^ zWmib7t86{II4Icn4y)wE*o2Hb7flY&xNhLO?dR-76&3lD4thziKBr`D{M7hdRL*Jd z&EGrXzcPcOLflsSv@tL$Kmi`$&B!FejL1C5(FDpoFtDT%#3C&#A)5_~Xk>dq5e)-N d8aDu412vn7XbUjo+L{@}0{~FNiiZFI literal 852 zcmWIWW@Zs#U|`^2cu^J;;V}EWnieAigCG+F0~b)VxFoe8-oRL|pfWY^VAf#+p1sn4 z_?4`ev|i%ZIL((FP$nV0)LMM|#9&7)cK3H-v;O|hS)P6TS@XpEo4?Fcd3~4hNI>~4 z^Tr0gxu2O%I~XUZr}#%@s{YUnaQygcrJ|Xx$^wrwvNj7<)fA6E&^aNu(3m%C>bohy zA}_BCxpqjuI9hQ~%Fg542ER=kYU=%_#`*1h#q_Sdm}_5KJ4<~0k=P0HIieC#+l}9D z;8p5lKQ6u5TWys@?+sQD&6_P@rcpn<{TC@8eCed!k)Bg|BrQNFI{e&$X|HdD$uWK9 zwn(pc;YYTm^W--(?WufIy{10<{kJyhKY|ug`xA?IxVT?#TP?gPTx?Z@k-rSj z_3i5=;}iRXVkZ5w*34^h=bSfLeC?w;^-RahJNa!^7D~^`db@a6*!=)_h&BY4M)a>_ z%=H0=Xf7~B`4Ax*Uy_~#3e_M;sIq_JKV)mtIDuc|i4j|B`^KPM#f4d_qAFztPx4aV z+)ua8G};y;^V;^Mr+?m>myN2t-#3-AT;V@v^hQ>60dH`z|76Q;6HeUTHlNU05Ok1g{Yt6wZDA39)QM*odv;C9SlP_{oPR@9LiRF*^NuP~O+m=Xg)?ILO z-a3iX487Jrx(X!U-M?Mq731vqOH=E>!ABO0eyy$D>2>#!^8>ZFk*Dka?LK)?07T6;yp{!xd{vnBuMc8G2`aqiWH(`@rLD*7hY8SrkHpEp5w*-7?~ravO& z{+OO_Ud=e;G`oVxxg%`fPWbHNEt(eSc*dr6>w$lNT}3WPw@!UA^~8U*{r476zjq=d zQDKe9rRL9bM5`DsUo$E!k+LeDIQM$Qwury6*=uI1{d=2|*sy1dUpiOz^)U6O?VWnkblFfu5BC?G(jY-D}dVhp4jqAv&-k5GNk_zUo6Wdq4G0bvP{J_U?r G1_l82a#fN5 diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_03_tgb.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_03_tgb.py index 49dee62af..600b23319 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_03_tgb.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_03_tgb.py @@ -1,7 +1,6 @@ -from taipy.gui import Gui, notify import taipy.gui.builder as tgb +from taipy.gui import Gui, notify -text = "Original text" def on_button_action(state): notify(state, 'info', f'The text is: {state.text}') @@ -12,13 +11,15 @@ def on_change(state, var_name, var_value): state.text = "" return -# Definition of the page -with tgb.Page() as page: - tgb.text("# Getting started with Taipy GUI", mode="md") - tgb.text("My text: {text}") +if __name__ == "__main__": + text = "Original text" - tgb.input("{text}") - tgb.button("Run local", on_action=on_button_action) + # Definition of the page + with tgb.Page() as page: + tgb.text("# Getting started with Taipy GUI", mode="md") + tgb.text("My text: {text}") + tgb.input("{text}") + tgb.button("Run local", on_action=on_button_action) -Gui(page).run(debug=True) + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_04.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_04.py index c3ef44b7c..44607f028 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_04.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_04.py @@ -1,10 +1,24 @@ -import pandas as pd +import pandas as pd + from taipy.gui import Gui, notify -text = "Original text" +def local_callback(state): + notify(state, 'info', f'The text is: {state.text}') + + temp = state.dataframe.copy() + temp.loc[len(temp)] = {"Text":state.text, + "Score Pos":0, + "Score Neu":0, + "Score Neg":0, + "Overall":0} + state.dataframe = temp + state.text = "" + +if __name__ == "__main__": + text = "Original text" -page = """ + page = """ <|toggle|theme|> # Getting started with Taipy GUI @@ -18,27 +32,12 @@ <|{dataframe}|table|number_format=%.2f|> <|{dataframe}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|> -""" - + """ + dataframe = pd.DataFrame({"Text":['Test', 'Other', 'Love'], + "Score Pos":[1, 1, 4], + "Score Neu":[2, 3, 1], + "Score Neg":[1, 2, 0], + "Overall":[0, -1, 4]}) -dataframe = pd.DataFrame({"Text":['Test', 'Other', 'Love'], - "Score Pos":[1, 1, 4], - "Score Neu":[2, 3, 1], - "Score Neg":[1, 2, 0], - "Overall":[0, -1, 4]}) - - -def local_callback(state): - notify(state, 'info', f'The text is: {state.text}') - - temp = state.dataframe.copy() - temp.loc[len(temp)] = {"Text":state.text, - "Score Pos":0, - "Score Neu":0, - "Score Neg":0, - "Overall":0} - state.dataframe = temp - state.text = "" - -Gui(page).run(debug=True) \ No newline at end of file + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_04.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_04.zip index ff172b50e6ba3e5b186af92667f5597875a40622..23380bbfd7b38417aca93fee847c7703e69806d4 100644 GIT binary patch literal 1456 zcmWIWW@Zs#-~hs)pdS$oP~gwXz`)0#z))P0S`cqw5?_*@q*qWG8p6xK-dnUFtq+Jn zbZG@Q10%~VdD@ezoUE-zVhnIB4*(VctY@C&3?1 zVW;{Rd@{FYY4&G3V%OMgeEi$LH|_I;rE;u261Pmb^TF%0*kh+sXMuA)Go13Jr!?+u z;a9QPz`HZ?->WJ71950y$QH|*!*k9zr#;i@5Z@1ynmZ26n^8aQIm8~tk%lo8cU*TRAzGTjdl5O zviACClicuv_NfyNai}_mI&fZIcjZM-eap?8wH@y{Ii0rKmUunOxRw?YYc4Ti!_kt( z)pKmlm#xY?ur8tX7)Rvou&m~%FKUv@dBXPZ+r$wSnsn;cq}KN@_Vcf6-C~p%c_UIl zareB4%^$B!`+iJAa>IEO_QUZ@JiOBOY>-^OUi`$I0A9W0)x*}mNFoOgNW-2A;_s{(ITt}|Vvaovvc$|Gm9HAF))BqTmU>R zeh5LN#VQsC1};Qegr&oh@&##SKn$WW(qUlt90P&6^XnyaTv@fNtG}zHFAUfvaw~7) zZS_c%S1;PKlx|koR==x%uToWgeOi&U(v#UW_kE0v155T^Vyn{Au49>1do*HgD0^FX zUC(UCh8dQ#9YIO&>j{a~8`{FA?m7E1n>+3wM_-#Xk1(4_+P$2v1LB*)>R7h!w^oqY zW3JH0X|v<)jYpH^jnqwUe4TJ;PjKPk?6cNA-dFn_E7FdLSY-#YiM3P<*;H5;Jy!MC zQ$GIh{)c^2y_9Q0-Ss15UHetP9u>Z@;jrc3)e)ZPEQK2@S#y)!*pFJH4lE_qR# z&GaLuiakzFc`hq%bbfD&=fyL3vMzF*j86aXjOF_t$LB|rw@(iAz5FPJ@5aL~(>8{0 za7=E=$??eD&@}&$OhS4!quG6Xqi>ZZ=Y)35m5X_}=FJ|lP4Z`QD%}f@$6JUt8+!S9 zJ=3T*E#-^RMk zaQCg{&tD0}*gLIKIQUxqhQOYi%e_^X1#R_;E?q46l<7KOAGgxRW2cU8IThwH+dSMq z-}A#~u5Y1#<~?BNZayw{_K&O_uPuAMcjxu8kDhlI?%%&BdGl(HjC(O^g>z@GRo``pmd9DFDTu@z>>xuplhIJ6OoDoyjj^m QdYOQ53y^*W^ale204soKIsgCw literal 1276 zcmWIWW@Zs#U|`^2kjzPpusW%2|DBP6p@fBjfeR>FT#{N4Z(yQVP}v)j+dbPs;Gf)y zdI=p@R_&d4YPr%E21s$`250=zY}xQCW7?~AImce#H2%MLb6!%_QvJfvZ#QSAmp!|g zn0hzE`2xq(ZsrfSpBT&)al7u|WELBO&X3+kA(zgxUq7Qv~UH$s=M(Ibo z5BAk>n!I>%pU0|YOF!R|zPImpW9==W%&Xa3g(W@LPV!1$bn9dIQl;N!Z6{be4|PcO z+jdTw9Gp9M(M{1?SDGeG|G4MJVbE;oS`2;2YI-YWN<(Iq9(q`A3+~W9S4L{HG z^dFqjZQI2ojP~4CTg`4VCusglFX_{Iyo;<3{$$uKoV4j+&5g@O+AG<3*)#7-d`><( z+otaHhqC#PTjEGAvw%l=9ELwF6_F+aN(>|eHDEMcmz-Lp}tuRxe_e|fm!j*PT3 z$~#goP3^h#_TZA6^%CkYZ`6w&T&=h=xk8AEyQ1zM<96}H9R-51?{}GAb6DlHS*&&c zy~h`_6!^I-q|SW2kX-koAS%P z+7Dd}$e7){%)h85)O~YEdFtl4^KF0L&y5vM4!X50>Cn0NGym?}cwrUWVb{y9soD-# zdM~j}Tg&07rQDTgW%-J2xkj$*)WvN3n1h!!J0DK<)2fQ!{XP;z8))snh`vd$H)OPpRtD^@J*u#LVgCjR_P;`@Kg+iTBG zajOWk-Ztazv)`<@|9{ZU{}8)((Xwon^Um)pO)YrS)Mak_U9d2D_kfdIu~pEkN$bD` zUGqIhUOs6zh~_T*;r-K!{k18ISG11LxN6D0uGzkvudwMh<5|5=+&8y8DK?wSlbPK!$*$Ue%j-I& z(14=D#@2~7o_kK$ReBxX@VB5;+;g*TX?-T|!4lrmc}2d@x9@oF&vCt@boSX=8zt`y z)6W$yoXaaa+z(ivO}07kTbkD>RP(LSbg96g1A)fnv)-*)ut(~1@^-yURh4h$p0_QO zye7N*tJG~+R3FuTB>M5W3v5-|Oi{NFtAFjfcRGHi<-Oh~b}Uu$`CSFllg>C-ELb3| zd}<#X>)C&ThB@9w+z;nwzj~n8w6AhsYPrD6uwRzTax0U*=m&T+GKnzYE^~nCih+?q s0Ym`-q69+Lhb=LJR73R11CuCJA2ewOc(byB # Getting started with Taipy GUI @@ -69,6 +65,6 @@ def local_callback(state): <|{dataframe}|table|number_format=%.2f|> <|{dataframe}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|> -""" + """ -Gui(page).run(debug=True) \ No newline at end of file + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_05.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_05.zip index 3af0e2ec1ce48deee3bb74ba05c056f6853d4360..52d318e0234fb9794c2d7aa3889d46356e24bb34 100644 GIT binary patch literal 2213 zcmb7_X*d*W8^?zs%M>d6gqbiQh73(o3L|@lY?;t0GeWX6*0GGTm$j1Y9I_ThlWjtl z5)*Sw*0LSj*w@N(%ypgKy53Lkd*9c6-Ouyk`QOi%-~UD%0@?ThoCm3IwrvggH`KTQ z03HAY;N^{Vw^vfN_jbGmclWn2KLX$g^vuQu9Tc=W>E%Gx@NXC$o`Ln{QM5*n8If_!Q&%- zTVno~?u^P7E0`LYck%5M$-SsyM9GpxmGiPEOQkPR;!0iH7lF;rFe3#YjzOc)+J;p6 ztMJX|w5+d7;wY}Bnl53xwWRCtcWt+QR}q|h0^a=bX=!SWh0_B$)2{4;?6;q_bf`L= z$}P!si+Yqs*XDoD*Q0;~V@VX}3q~<~>iLp*OoFU4W z=C`dass1j)S9b-Q(1;dwuf1_O6~E*}^Kaf^2k&J*C<;$kdOJ9FnqP3ybv&fk6}7Ae zl?c>acJFNG^Z1-Yhq5Z;rfVAe$IN9)R(X%2qjp}l{5STRqT5qM&hZJ5%2Eg*U1PK zZ?OE#8{hoOKQ>dd$$44P*sjHC6pNRD{4mqjPE}$I}hh@msIILhBig*l^ zdnB4%gsq4A)Yk#Wk5fLTUBLVN-T!c94xgaBLj=iyo_p%fyc4J@?JtceO<6mmj=I0H zfZ>bAnmcjnvsgFJpvPQQqMOD zT&jM$5cWjXmrn@qL?P#_7k4r|i<}aJFIyyi_m6QKdfGEvdN*D0*g93SvF~CWf7Pf3 z_eH4HO$DKN!#on2eOevK+4-0K(rnw7$JM%+!k*9eyc)sQ8IAI@F+>n!iP-(VV3CSB zt)unjeyro^EB6?V)_CWEuiBZgc^U`4flnl1L;u@wxycQ&ud;+N3D;%K zqEa9%iOjaOazlT`^?MZ0@Ivd|tAx((`3izi!5`LoBTeW%l)%tF%t%|QaJRlO> z23Hq%+eS)yh-Kj3w4*3FZf$A1LTEz{PAK30av~4_U?PqF5A4I{zhD>Q1OT{y!Tu9; zQ@?E7wS!{z{{lVL!q%EfLYS=Ofu6(Ih@;IVb3o>)p(i;_OdZZ{ejfM`KxdQ> zrN7yKK2S3O8*5&u>CK-|TO0Gjwb#E$C7}^d5y180wQTAO*5s8p@y78Yj;wfI#EVLS zx`m^b2q*4>(=;3i|CjZK-IUCz+^$FyQU7c6JO%^YtM%RSuXR`fm+fi|nAl#2-6RiJ*U z1rr~ZjmU7(QQ`$e)j=?d%W(w+QJC2p&^O{z1l_R!iX@{BxjV@pZb|dJpK7}Gyy@CwkG~*gyE!TMhHYs|OqfpSzb+WN=g$`+F4e{v$X3ukK zsP?uK=F~V$lDCfPuM-w;N3|pdNn8TkNLHvAJaaG`>ZG+7xAn)zE;DpZvKC=;P}num zBbot>RR^7{bGjd18LPz4lIPBz59RR^-9YMzOp9%kK|(3&89%z~ZwE$ZiJj1pJKp`H zV`_HJ9x72O0__Rmkk#$zgigjdoD%bUf8rta2c-mJ-i9(D+%i_y&98f>8MSAvMGxOc=weZi7J)5#IFs#0oc^SNtHy|0m6yx+uETWM2f z*>M?XY{}IcB$F!pxAE*bzBgJbiGT1dv-X-FlQV|qV4Q3|eKP2C*PzWMTBSeENMA)Z z+x3sI`iM8d*2)lhWz-LylcD=9E>_!9`a!;%=jyY<_ahZ0q9vwVKDH<|s*3saSPEzO zS*8|H5_mi#M+|HI;Zz&Ap>7%J39zjFi2SfkWUS)jYHf_k;EC=!^-KJ4Mtr`20eIrd zY>+rxUaaAHCm#3FhB?P<46kPQ_eEFl!J1I_T zA_JMFg?&G|QyIg7#DPiuARBMRtnC{pMFs1XD0AXYg}HQ~1BPu^8y+Je$vJ*DfbQ1s z%^MKabvEC?aY!^-wQt0A{7RLJlfRTC*dgpgpq<&GeGr=Q6$IXXJ-19Q@{A?f=19(1z@Xm~UAR MvihJ8aWHTH0F)%>00000 literal 2054 zcmZ{ldpr{g8^@Pr8Adr{BUzn{DGiIcCznR%vJuH*scpzT%Z=wR%)J2w z06ZiB0LiUsXc#q^tgVL*j$*jH3w&p=Gfsaz0d9a&g=J&y*Xy*)#g1v2Coa-@xsFK_ zPH${z_^a-Dw&l2Qt9zUZM_#GfLrDDKZsokg-neF0q}!|89Sk&a_c*npA!U&5a&Q@f z+{}(P>Oi!`5ftgGwh65Xe)$@_U0v{-qWn{}6okK%r{2|SZGoM1FHXRr==XJmy?OA0 zdr#>Mh@w~PVn=JR7&~xzLbIz^UJp^#eVzxX*6i7B?JeY6NVB9~NuhnM8?{4k%EE%i zHjdTC7GRh{lfv@#HqTH$BH}#b7H2`*3nUA%eTk1IlX6puGf%ENjJNbGIM?X5nsx46 zLm3%H$^8hrmmuqD0*MbvDFRPCoi|Qs1G;H21Cxryb2(MXgHi;iT!~sZOmo-F;9>!~ zcj$iJQRORdK;RKSE3kTR=~20|O_=pAgHDmMl8a@hs)ksTZUHtN3Oa5-tM9ruV3mzk zK+UrYp6;EjJ_zcAR4LocDRyLjx^BRhRbOkh!M}YNT=zI|sU z(7AhdH`V797czZyiT%aff9#r9Qq};oc9!tzJ_GyLeqol4x{Y)O5AIvEUnqJQP?h>oM~k8&tLBl}bqzr?pL!WS z8sS)cpsXPStqbY^TBp=zpt2nMG*c2 za3V3>O>tA@Ma~w$d%*yJ%s&8=!@SRKL0sWV3VLg_GoI|bd6^-JH1|zhF>&bxmJ{|7 z>1U#9Y8cn-oHCwaIY5ZZrt#r!s#ZYHY|_O?^y#lrQ^k09#eR%;Qv(BY2>#OQE+b?i zeEO|z98e=Z>G%)fX~yfv&QnscOGg#HR89=gZK0!JWMKxq&VOH6sXHWP{MB}vi@-ge zbvn~~n9cPb#Z-IWn5wq|$A=l7HFR(bS63@xIjGtlP_Kz!Db9NH_&0m-mA$8#TChLo z$N3L4#bLO&7H6$gC2T^U#vbXqG_Oq;W%M;7Ueu3QLS2x%H(EEK-ARVJ2X;)Zd37IB zcF%QaSW7_#{w}d6LISVxlZ{P$D+#84nwS)nFGtWE$3;X5$&Dw_?6pJ9lZ=T&nlRD+ z@_CHu^GRbPTw@FU!jWd_w!4((GdVxElO?H%aZUwr|2eMxRkZ6b~9$8~pTmP2p7g z9y^BORCq2@6I$=&)mjrA4vAN~QK!BzaM#&rEaf|85gK>SpvcfiPiIabg5FLUdF`O4 z!H*nH%$(UtzM9&OSQ=TbR5ND?xN{~78zdd&^=-u(VqS|)S&|vXdRS0JL%gn~fpqtb1XurT&&T=WOgVQ%A(trEt7K{L$XZSOOw%A+ondxMfO<# zvgE};asK-9x(kP$CYPs7CHb}Evsw3%lgLeq$hLV^40Ym<%pJ9mM5|Qdg-^&0Tw)Wb zQ^#F)WE_tfiZlI4U%i$dijh%MG0GbLs2uRbNH|7MqaAjzPhGJ5(BEhB6GXso6N3W& z|M%VE7qAVm_gC49e}3_Q>;4z?zpnqSYuU1bzjc3G00A!!`n4C^%CM~(yW>~)7bN+y AlmGw# diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_05_tgb.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_05_tgb.py index 97241559b..4ccffd8ac 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_05_tgb.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_05_tgb.py @@ -1,32 +1,22 @@ -from transformers import AutoTokenizer, AutoModelForSequenceClassification -from scipy.special import softmax -import numpy as np import pandas as pd -from taipy.gui import Gui, notify -import taipy.gui.builder as tgb - +from scipy.special import softmax +from transformers import AutoModelForSequenceClassification, AutoTokenizer -text = "Original text" +import taipy.gui.builder as tgb +from taipy.gui import Gui, notify # Model setup MODEL = "cardiffnlp/twitter-roberta-base-sentiment" tokenizer = AutoTokenizer.from_pretrained(MODEL) model = AutoModelForSequenceClassification.from_pretrained(MODEL) -# Initial dataframe -dataframe = pd.DataFrame({"Text":[''], - "Score Pos":[0.33], - "Score Neu":[0.33], - "Score Neg":[0.33], - "Overall":[0]}) - def analyze_text(text): # Run for Roberta Model encoded_text = tokenizer(text, return_tensors='pt') output = model(**encoded_text) scores = output[0][0].detach().numpy() scores = softmax(scores) - + return {"Text":text, "Score Pos":scores[2], "Score Neu":scores[1], @@ -41,30 +31,40 @@ def local_callback(state): state.dataframe = temp state.text = "" -# Definition of the page with tgb -with tgb.Page() as page: - tgb.toggle(theme=True) +if __name__ == "__main__": + text = "Original text" + + # Initial dataframe + dataframe = pd.DataFrame({"Text":[''], + "Score Pos":[0.33], + "Score Neu":[0.33], + "Score Neg":[0.33], + "Overall":[0]}) + + # Definition of the page with tgb + with tgb.Page() as page: + tgb.toggle(theme=True) + + tgb.text("# Getting started with Taipy GUI", mode="md") + tgb.text("My text: {text}") - tgb.text("# Getting started with Taipy GUI", mode="md") - tgb.text("My text: {text}") + tgb.input("{text}") + tgb.button("Analyze", on_action=local_callback) - tgb.input("{text}") - tgb.button("Analyze", on_action=local_callback) + # Displaying sentiment scores and overall sentiment + tgb.text("## Positive", mode="md") + tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") - # Displaying sentiment scores and overall sentiment - tgb.text("## Positive", mode="md") - tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") - - tgb.text("## Neutral", mode="md") - tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") + tgb.text("## Neutral", mode="md") + tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") - tgb.text("## Negative", mode="md") - tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") + tgb.text("## Negative", mode="md") + tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") - tgb.table("{dataframe}", number_format="%.2f") - tgb.chart("{dataframe}", type="bar", x="Text", - y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", - color__1="green", color__2="grey", color__3="red", type__4="line") + tgb.table("{dataframe}", number_format="%.2f") + tgb.chart("{dataframe}", type="bar", x="Text", + y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", + color__1="green", color__2="grey", color__3="red", type__4="line") -# Initialize the GUI with the updated dataframe -Gui(page).run(debug=True) + # Initialize the GUI with the updated dataframe + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_06.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_06.py index 88eb56ad4..0cf4d9877 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_06.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_06.py @@ -1,14 +1,44 @@ -from transformers import AutoTokenizer -from transformers import AutoModelForSequenceClassification +import pandas as pd from scipy.special import softmax +from transformers import AutoModelForSequenceClassification, AutoTokenizer -import numpy as np -import pandas as pd from taipy.gui import Gui, notify -text = "Original text" +MODEL = "cardiffnlp/twitter-roberta-base-sentiment" +tokenizer = AutoTokenizer.from_pretrained(MODEL) +model = AutoModelForSequenceClassification.from_pretrained(MODEL) + +def analyze_text(text): + # Run for Roberta Model + encoded_text = tokenizer(text, return_tensors='pt') + output = model(**encoded_text) + scores = output[0][0].detach().numpy() + scores = softmax(scores) + + return {"Text":text, + "Score Pos":scores[2], + "Score Neu":scores[1], + "Score Neg":scores[0], + "Overall":scores[2]-scores[0]} -page = """ +def local_callback(state): + notify(state, 'Info', f'The text is: {state.text}', True) + temp = state.dataframe.copy() + scores = analyze_text(state.text) + temp.loc[len(temp)] = scores + state.dataframe = temp + state.text = "" + +if __name__ == "__main__": + text = "Original text" + + dataframe = pd.DataFrame({"Text":[''], + "Score Pos":[0.33], + "Score Neu":[0.33], + "Score Neg":[0.33], + "Overall":[0]}) + + page = """ # Getting started with Taipy GUI <|layout|columns=1 1| @@ -37,39 +67,6 @@
<|{dataframe}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|> -""" - -MODEL = f"cardiffnlp/twitter-roberta-base-sentiment" -tokenizer = AutoTokenizer.from_pretrained(MODEL) -model = AutoModelForSequenceClassification.from_pretrained(MODEL) - -dataframe = pd.DataFrame({"Text":[''], - "Score Pos":[0.33], - "Score Neu":[0.33], - "Score Neg":[0.33], - "Overall":[0]}) - - -def analyze_text(text): - # Run for Roberta Model - encoded_text = tokenizer(text, return_tensors='pt') - output = model(**encoded_text) - scores = output[0][0].detach().numpy() - scores = softmax(scores) - - return {"Text":text, - "Score Pos":scores[2], - "Score Neu":scores[1], - "Score Neg":scores[0], - "Overall":scores[2]-scores[0]} - - -def local_callback(state): - notify(state, 'Info', f'The text is: {state.text}', True) - temp = state.dataframe.copy() - scores = analyze_text(state.text) - temp.loc[len(temp)] = scores - state.dataframe = temp - state.text = "" + """ -Gui(page).run(debug=True) \ No newline at end of file + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_06.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_06.zip index 9687ebd6ae8a6380e2a539834fe387a77431a8ec..dec7e8425d02a4e32625ef890e69f26bf1fc36e4 100644 GIT binary patch literal 2121 zcmb7_dpOhWAIHDW=kQqNm_;Gt@er$_*-B1JOQNANZP=(Hg5yV<+$v&qWh z`2xxV7&)PxL@!hvsE{1xIBA$y! z&b;|82jUz{T#r@|`~J@O5soS2TMIHs9B%IdFGEmpV|P{G5B*lh=JO!C_3m9S7yL2c zR4=noJ#C;x9q(5V)#Xy&iwh2?QJ;-V4IE;DxGPhOu=R}0x5V-cw=91K>`%8~*|HP6 z!%-y46tbmU921oaQAG~;*W9_}ZTcE2HUt{Zf*VTlYf@h$3b?ZgUxAm4Bia@M+nhQ{lbn)V23u95dudL1Q=>G(0H z?bLj|MnGNGzq_a3Om!d`I49h*2o+O&JjiV>SE|1vE03qwa7;UkW$Bd9#Y%TrPaP_@ zWgwgytCK_p9CNT%eNxCHg5ZnDXO6ooIG|9q4zZ^xd25FWp=_`Ao|MXmHh5o^(`gl! z^GEnO=h#lxap}1q)a<5Es+ZZe?j+u8u9?x;kPntc3{u{~EAnez+FREULl*AR|5TbO zm^$X6!IQ?Vj#>0P6~Z}%B1Y;|&YRWS%oF+*n8B_Sz4&>kP(y@EJ1r!^>EnR|rTpuh zmPlmwjP=Ky8_+f>yjATH?HlR@|L?nQ%fuLHuW0G;Zlr4!x#fjpZK&<1FuKl+E`EiI z?eNP+3%z-9Ek*?_G2&=>G^>R!NK=+e6eY7+J5*TIg*0waQL5eVi@ZC~s7u}|@eAL* z1FKDqN`k&2Z#8tp&17u5n?w_?9&csNnO9G$_wfZCJLC9Z|0`Ay?80jJgJIqUbvzzg z=k>9qwhFDG&?c*Kq%-^F^lD#P%2t)iScT?dO{9je41TLo=TDTmT-D9pD4@ zla_Fwt{nFlXvq3?DrU_Qn+_oVB9pY1*F^jd~Z5MIjjgjE6_ePyEFp(6?%6nI&G zOT(Zy#Tpb@%4hgQ^keSGx!ZqP*jocMD`RGAx*l+5W(ZGbiSB-D5MMut@YTaOctF*wDwu>p;$s!NlmjP?QP>)Zc(w5 zW1mAYy<=kFm1#&RloQ$cvMtZ@YLg=fOhc*4B7`F&=&#PY6MdK`O&om&>9O;o(8vQ) z5_j+PlE5>k>4(4gk82B3K5vbU2wg#E`z!8s)BOZP9E3yQQ_oHK{6zdPyBp8377WFy$sGP%_6n1%g^02d zcxvf)T_D-wM&El);pob-V%(A`v$lfoa1fjEslc$eMz86zcV*CmJ~_W{{o^yva{qBW zo}oEM*`6)-i(jI zkPyj_({(IpZ6bLYsiT9z@Gg=COs&NLF={_@D6>1T-IpwCLx#t3L5F#U`o9)sy$t?>J+nO_pCxibl=C6We2F z0;>I@B-bGMPg;*WpA#E4^a@M3p?Pr(QH{aZc8olfw+b%4_*$KL>rqmAanuTUK(EQu z?*p|?-{AAZKsm52zcqDDudssDvx>bf3{zLm%OCWQ+0MUrr}hA)gwcY<^!B5NET3-> zDIuBjVxr7pgV0S5QI0~wAd#N|{42ei0sKQ$!shD#i{oEsZ}R`^xtsj|5S8$5<2L`! Y{vUn=l%tsV=3e2AqHp-sjduXRKO|AeU;qFB literal 1968 zcmZ{lc{tRI8pnUO$yU~}GzXzLH(@GEWhiCKoWaOG)-lX;4ACIF#*!o=%ovWb8`2nS zmr|B2Wt;56m~3e*ktNM3jjQLL=brn=z3=U(@p-;Ba6W!%000C5d4De_ z^VQ5^Yd!#2I|2a0htuE?pCAvYo>ou<(LTU>1}e^Ve|*q!Ixn+GlC}3(#bVT5d_-=P zZB$%^&w|&I-sOG*q}_5ESU#rIzD@xr#P(A!k%9 z$!B2WCyp8L;qDHQ>s(P5?)$WVTj%9ZR@EbD+f^BAmoWE^YNngZJ}srx zWi7{XVR{wPTS%9o)CPm{EO}*vii}eu`6GP>OxqtKdG3g6JisJ6%Ep_I$-43rJWX%Ej3d}wQPMKjN!n5~uG{=LF;LWF}ygY~! z4oqIkuY=&G)-#>F&Aaz>CRz409q};~KaX#Br|#O6P8-hZz0GONJ}-C=(JG*<(xf`T zA)!pzm*osh9U|MZeBBrvP*h1>sL*iA+Okoe6e1?3IT<801Y1SGfV|h%zDdh7rXdj` zl~=4HH4wwOpbSdH(!lcusMECtye&rS#Emcx;c(x-H}s;eM;+&57E&g)Hv z)wQdn&FbbjL%xv|UL`r~cUIdd5MK3kFdxN=R1p!Akt1RZay@y!6{I)$a zPhONM?yN`*xD+VtRcDH}JdDA?JM&4^QspM9&bNd8Dj#{1&q+6qNWL8TH9)1N(R~QC z(B1uycxAc;cVpwyjeBQ9&Lxm#QXxHoWWtB7G^NCwJ>Tx2TMmB^p)|$(v&AcBo++dM z)J5AKPDuL!>lv@;{G~Oy7c|h}K`xfOMt#ZionuEHM6NC-HVsWuV~~xw8_Se_yNDa4 z$Q?+KDn;nLw-`g=`FtAd8NDd0`zkUM!?>&yDfa{$GRsa^@6n}-hec8nc6$Y7OxEKK zN(N7koe@NR{jzyUU-h#gdsIV9F!ZjfgoC}zGs*$T=0DgGkfBbdADCMShuFb|0N~i) z*m;Ct(TC_&JG>9fzaSoKzHp~D*@~PJguq)r3a|VICu-$X%^I0LA;!fy3H;H3(AMcY zVAUNx({kOa!oBpU^V{g1h~);XMK#7e6@7KmHnd1*-c6gRTmw?o-_{W1D%h=(9P8uv zD0YSOn>;2$H7KfXO+>F~j*6&Xe>t3$p1V=JM5FXJ(h#pVUU|AaC|)yvr6chJy_Q=! z6kphy*DTuLI@pda_{wK}KO<>!QL>3pkDdz<=(8nL1rwmqAgqN|39cKW1y#Z&(>^9f zi!(h_oD^65z4*VX`_eCn(&_JC{1^r0{AT}xZaQ;tlRMu-xMW`s_`LhQLnq%)JSmKG zW#N<}pP2N3zj2E@kKdqx-Po|Y*W6deK|=dmTUwPe_&m*l##hoITDif>D6O4>xVARH zBb7k>cS_QTOPS2BEj`L_h49CO=U#QMB#lw9pvR+44s6_A!T<;Ft0!kR?JBCG4Z zSa!n75y-+D_5)cQRj4%J?D4aTsS%6nPugp@Nou(*t-EptZur%sS(BGz^e~yxnl1ge zeca)j_ir+q(s{W2YVA{51Yfc62;g1e>w2Dxv)2r_y^P8nNVM7cKveCv#(0uE`E74l zNmKdBK5gCmK|hi;#evrJ|6tswAcHDZ20-#cVR_xsgL5#YF_jp zEz923jXccU|7_=G&M1bb1bsBa5A&w!?OE?)S`~xZ1osILuY@@QbIMWpe8ev5w!3-1 z+JV}HbzdkRjRL99>7%Ft>#)_T3X?5P)G$^7YMet0TqxgJ2tea5SaH?yue7?IXSr{) zGd?&{$7(%JNR7a<*@!v&HwiOFVKHp|JxUKi2q-{ Xzp%G~3xIy^c@I0}P}L4I836tT2GyCm diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_06_tgb.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_06_tgb.py index 203c114ba..da6040771 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_06_tgb.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_06_tgb.py @@ -1,33 +1,22 @@ -from transformers import AutoTokenizer, AutoModelForSequenceClassification -from scipy.special import softmax -import numpy as np import pandas as pd -from taipy.gui import Gui, notify -import taipy.gui.builder as tgb +from scipy.special import softmax +from transformers import AutoModelForSequenceClassification, AutoTokenizer -text = "Original text" +import taipy.gui.builder as tgb +from taipy.gui import Gui, notify # Initialize model and tokenizer MODEL = "cardiffnlp/twitter-roberta-base-sentiment" tokenizer = AutoTokenizer.from_pretrained(MODEL) model = AutoModelForSequenceClassification.from_pretrained(MODEL) -# Initial dataframe setup -dataframe = pd.DataFrame({ - "Text": [''], - "Score Pos": [0.33], - "Score Neu": [0.33], - "Score Neg": [0.33], - "Overall": [0] -}) - def analyze_text(text): # Run sentiment analysis model encoded_text = tokenizer(text, return_tensors='pt') output = model(**encoded_text) scores = output[0][0].detach().numpy() scores = softmax(scores) - + return { "Text": text, "Score Pos": scores[2], @@ -44,30 +33,42 @@ def local_callback(state): state.dataframe = temp state.text = "" -# GUI layout with tgb -with tgb.Page() as page: - with tgb.layout(columns="1 1"): - with tgb.part(): - tgb.text("My text: {text}") - tgb.input("{text}") - tgb.button("Analyze", on_action=local_callback) +if __name__ == "__main__": + text = "Original text" + + # Initial dataframe setup + dataframe = pd.DataFrame({ + "Text": [''], + "Score Pos": [0.33], + "Score Neu": [0.33], + "Score Neg": [0.33], + "Overall": [0] + }) + + # GUI layout with tgb + with tgb.Page() as page: + with tgb.layout(columns="1 1"): + with tgb.part(): + tgb.text("My text: {text}") + tgb.input("{text}") + tgb.button("Analyze", on_action=local_callback) - with tgb.expandable("Table"): - tgb.table("{dataframe}", number_format="%.2f") + with tgb.expandable("Table"): + tgb.table("{dataframe}", number_format="%.2f") - with tgb.layout(columns="1 1 1"): - with tgb.part(): - tgb.text("## Positive", mode="md") - tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") - with tgb.part(): - tgb.text("## Neutral", mode="md") - tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") - with tgb.part(): - tgb.text("## Negative", mode="md") - tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") + with tgb.layout(columns="1 1 1"): + with tgb.part(): + tgb.text("## Positive", mode="md") + tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") + with tgb.part(): + tgb.text("## Neutral", mode="md") + tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") + with tgb.part(): + tgb.text("## Negative", mode="md") + tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") - tgb.chart("{dataframe}", type="bar", x="Text", y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", - color__1="green", color__2="grey", color__3="red", type__4="line") + tgb.chart("{dataframe}", type="bar", x="Text", y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", + color__1="green", color__2="grey", color__3="red", type__4="line") -# Run the GUI -Gui(page).run(debug=True) + # Run the GUI + Gui(page).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_07.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_07.py index c0a367ef5..b3b04df83 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_07.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_07.py @@ -1,14 +1,63 @@ -from transformers import AutoTokenizer -from transformers import AutoModelForSequenceClassification +import pandas as pd from scipy.special import softmax +from transformers import AutoModelForSequenceClassification, AutoTokenizer -import numpy as np -import pandas as pd from taipy.gui import Gui, notify -text = "Original text" +MODEL = "cardiffnlp/twitter-roberta-base-sentiment" +tokenizer = AutoTokenizer.from_pretrained(MODEL) +model = AutoModelForSequenceClassification.from_pretrained(MODEL) + +def analyze_text(text): + # Run for Roberta Model + encoded_text = tokenizer(text, return_tensors='pt') + output = model(**encoded_text) + scores = output[0][0].detach().numpy() + scores = softmax(scores) + + return {"Text":text[:50], + "Score Pos":scores[2], + "Score Neu":scores[1], + "Score Neg":scores[0], + "Overall":scores[2]-scores[0]} + +def local_callback(state): + notify(state, 'Info', f'The text is: {state.text}', True) + temp = state.dataframe.copy() + scores = analyze_text(state.text) + temp.loc[len(temp)] = scores + state.dataframe = temp + state.text = "" -page = """ +def analyze_file(state): + state.dataframe2 = dataframe2 + state.treatment = 0 + with open(state.path,"r", encoding='utf-8') as f: + data = f.read() + + # split lines and eliminates duplicates + file_list = list(dict.fromkeys(data.replace('\n', ' ').split(".")[:-1])) + + for i in range(len(file_list)): + text = file_list[i] + state.treatment = int((i+1)*100/len(file_list)) + temp = state.dataframe2.copy() + scores = analyze_text(text) + temp.loc[len(temp)] = scores + state.dataframe2 = temp + + state.path = None + +if __name__ == "__main__": + text = "Original text" + + dataframe = pd.DataFrame({"Text":[''], + "Score Pos":[0.33], + "Score Neu":[0.33], + "Score Neg":[0.33], + "Overall":[0]}) + + page = """ # Getting started with Taipy GUI <|layout|columns=1 1| @@ -35,47 +84,13 @@ |> <|{dataframe}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|> -""" - -MODEL = f"cardiffnlp/twitter-roberta-base-sentiment" -tokenizer = AutoTokenizer.from_pretrained(MODEL) -model = AutoModelForSequenceClassification.from_pretrained(MODEL) - -dataframe = pd.DataFrame({"Text":[''], - "Score Pos":[0.33], - "Score Neu":[0.33], - "Score Neg":[0.33], - "Overall":[0]}) - -dataframe2 = dataframe.copy() - -def analyze_text(text): - # Run for Roberta Model - encoded_text = tokenizer(text, return_tensors='pt') - output = model(**encoded_text) - scores = output[0][0].detach().numpy() - scores = softmax(scores) - - return {"Text":text[:50], - "Score Pos":scores[2], - "Score Neu":scores[1], - "Score Neg":scores[0], - "Overall":scores[2]-scores[0]} - - -def local_callback(state): - notify(state, 'Info', f'The text is: {state.text}', True) - temp = state.dataframe.copy() - scores = analyze_text(state.text) - temp.loc[len(temp)] = scores - state.dataframe = temp - state.text = "" + """ + path = "" + treatment = 0 + dataframe2 = dataframe.copy() -path = "" -treatment = 0 - -page_file = """ + page_file = """ <|{path}|file_selector|extensions=.txt|label=Upload .txt file|on_action=analyze_file|> <|Downloading {treatment}%...|>
@@ -87,33 +102,10 @@ def local_callback(state):
<|{dataframe2}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|height=600px|> + """ -""" - -def analyze_file(state): - state.dataframe2 = dataframe2 - state.treatment = 0 - with open(state.path,"r", encoding='utf-8') as f: - data = f.read() - - # split lines and eliminates duplicates - file_list = list(dict.fromkeys(data.replace('\n', ' ').split(".")[:-1])) - - - for i in range(len(file_list)): - text = file_list[i] - state.treatment = int((i+1)*100/len(file_list)) - temp = state.dataframe2.copy() - scores = analyze_text(text) - temp.loc[len(temp)] = scores - state.dataframe2 = temp - - state.path = None - - -pages = {"/":"<|toggle|theme|>\n
\n<|navbar|>\n
", - "line":page, - "text":page_file} - + pages = {"/":"<|toggle|theme|>\n
\n<|navbar|>\n
", + "line":page, + "text":page_file} -Gui(pages=pages).run(debug=True) \ No newline at end of file + Gui(pages=pages).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_07.zip b/docs/tutorials/fundamentals/1_understanding_gui/src/step_07.zip index 3f75328d1d312159865fe22cef733ae3933658ab..a388af7de43dd5c2959166ca9ef759e43f44086d 100644 GIT binary patch literal 2959 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 a`mfplgT-cWdWN&Nv_G@yXYXS^yZsvo5m6Ta literal 2836 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 diff --git a/docs/tutorials/fundamentals/1_understanding_gui/src/step_07_tgb.py b/docs/tutorials/fundamentals/1_understanding_gui/src/step_07_tgb.py index 2df37a2ea..2af7311b8 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/src/step_07_tgb.py +++ b/docs/tutorials/fundamentals/1_understanding_gui/src/step_07_tgb.py @@ -1,33 +1,22 @@ -from transformers import AutoTokenizer, AutoModelForSequenceClassification -from scipy.special import softmax -import numpy as np import pandas as pd -from taipy.gui import Gui, notify -import taipy.gui.builder as tgb +from scipy.special import softmax +from transformers import AutoModelForSequenceClassification, AutoTokenizer -text = "Original text" +import taipy.gui.builder as tgb +from taipy.gui import Gui, notify # Initialize model and tokenizer MODEL = "cardiffnlp/twitter-roberta-base-sentiment" tokenizer = AutoTokenizer.from_pretrained(MODEL) model = AutoModelForSequenceClassification.from_pretrained(MODEL) -# Initial dataframe setup -dataframe = pd.DataFrame({ - "Text": [''], - "Score Pos": [0.33], - "Score Neu": [0.33], - "Score Neg": [0.33], - "Overall": [0] -}) - def analyze_text(text): # Run sentiment analysis model encoded_text = tokenizer(text, return_tensors='pt') output = model(**encoded_text) scores = output[0][0].detach().numpy() scores = softmax(scores) - + return { "Text": text, "Score Pos": scores[2], @@ -44,38 +33,6 @@ def local_callback(state): state.dataframe = temp state.text = "" -# GUI layout with tgb -with tgb.Page() as page: - with tgb.layout(columns="1 1"): - with tgb.part(): - tgb.text("My text: {text}") - tgb.input("{text}") - tgb.button("Analyze", on_action=local_callback) - - with tgb.expandable("Table"): - tgb.table("{dataframe}", number_format="%.2f") - - with tgb.layout(columns="1 1 1"): - with tgb.part(): - tgb.text("## Positive", mode="md") - tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") - with tgb.part(): - tgb.text("## Neutral", mode="md") - tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") - with tgb.part(): - tgb.text("## Negative", mode="md") - tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") - - tgb.chart("{dataframe}", type="bar", x="Text", y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", - color__1="green", color__2="grey", color__3="red", type__4="line") - - -# Second page - -dataframe2 = dataframe.copy() -path = "" -treatment = 0 - def analyze_file(state): state.dataframe2 = dataframe2 state.treatment = 0 @@ -84,7 +41,6 @@ def analyze_file(state): # split lines and eliminates duplicates file_list = list(dict.fromkeys(data.replace("\n", " ").split(".")[:-1])) - for i in range(len(file_list)): text = file_list[i] state.treatment = int((i+1)*100/len(file_list)) @@ -95,24 +51,66 @@ def analyze_file(state): state.path = None -with tgb.Page() as page_file: - tgb.file_selector("{path}", extensions=".txt", label="Upload .txt file", - on_action=analyze_file) - tgb.text("Downloading {treatment}%...") +if __name__ == "__main__": + text = "Original text" + + # Initial dataframe setup + dataframe = pd.DataFrame({ + "Text": [''], + "Score Pos": [0.33], + "Score Neu": [0.33], + "Score Neg": [0.33], + "Overall": [0] + }) + + # GUI layout with tgb + with tgb.Page() as page: + with tgb.layout(columns="1 1"): + with tgb.part(): + tgb.text("My text: {text}") + tgb.input("{text}") + tgb.button("Analyze", on_action=local_callback) + + with tgb.expandable("Table"): + tgb.table("{dataframe}", number_format="%.2f") + + with tgb.layout(columns="1 1 1"): + with tgb.part(): + tgb.text("## Positive", mode="md") + tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") + with tgb.part(): + tgb.text("## Neutral", mode="md") + tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") + with tgb.part(): + tgb.text("## Negative", mode="md") + tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") + + tgb.chart("{dataframe}", type="bar", x="Text", y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", + color__1="green", color__2="grey", color__3="red", type__4="line") + + # Second page + dataframe2 = dataframe.copy() + path = "" + treatment = 0 + + with tgb.Page() as page_file: + tgb.file_selector("{path}", extensions=".txt", label="Upload .txt file", + on_action=analyze_file) + tgb.text("Downloading {treatment}%...") - with tgb.expandable("Table"): - tgb.table("{dataframe2}") + with tgb.expandable("Table"): + tgb.table("{dataframe2}") - tgb.chart("{dataframe2}", type="bar", x="Text", - y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", - color__1="green", color__2="grey", color__3="red", type__4="line", - height="800px") + tgb.chart("{dataframe2}", type="bar", x="Text", + y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", + color__1="green", color__2="grey", color__3="red", type__4="line", + height="800px") -# Run the GUI -# One root page for common content -# The two pages that were created -pages = {"/":"<|toggle|theme|>\n
\n<|navbar|>\n
", - "line":page, - "text":page_file} + # Run the GUI + # One root page for common content + # The two pages that were created + pages = {"/":"<|toggle|theme|>\n
\n<|navbar|>\n
", + "line":page, + "text":page_file} -Gui(pages=pages).run(debug=True) + Gui(pages=pages).run(debug=True) diff --git a/docs/tutorials/fundamentals/1_understanding_gui/step_01/step_01.md b/docs/tutorials/fundamentals/1_understanding_gui/step_01/step_01.md index de3c526b9..02ded476e 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/step_01/step_01.md +++ b/docs/tutorials/fundamentals/1_understanding_gui/step_01/step_01.md @@ -16,7 +16,8 @@ your web browser to open your first Taipy page! ```python from taipy import Gui -Gui(page="# Getting started with *Taipy*").run(debug=True) # use_reloader=True +if __name__ == "__main__": + Gui(page="# Getting started with *Taipy*").run(debug=True) # use_reloader=True ``` The run method accepts different useful parameters: diff --git a/docs/tutorials/fundamentals/1_understanding_gui/step_02/step_02.md b/docs/tutorials/fundamentals/1_understanding_gui/step_02/step_02.md index dd4d3e59f..22fa4974a 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/step_02/step_02.md +++ b/docs/tutorials/fundamentals/1_understanding_gui/step_02/step_02.md @@ -83,32 +83,34 @@ Here is the combined code: ```python from taipy.gui import Gui - text = "Original text" + if __name__ == "__main__": + text = "Original text" - page = """ - # Getting started with Taipy GUI + page = """ + # Getting started with Taipy GUI - My text: <|{text}|> + My text: <|{text}|> - <|{text}|input|> - """ + <|{text}|input|> + """ - Gui(page).run(debug=True) + Gui(page).run(debug=True) ``` === "Python" ```python from taipy.gui import Gui import taipy.gui.builder as tgb - text = "Original text" + if __name__ == "__main__": + text = "Original text" - with tgb.Page() as page: - tgb.text("# Getting started with Taipy GUI", mode="md") - tgb.text("My text: {text}") + with tgb.Page() as page: + tgb.text("# Getting started with Taipy GUI", mode="md") + tgb.text("My text: {text}") - tgb.input("{text}") + tgb.input("{text}") - Gui(page).run(debug=True) + Gui(page).run(debug=True) ``` ![Visual Elements](images/result.png){ width=90% : .tp-image-border } diff --git a/docs/tutorials/fundamentals/1_understanding_gui/step_03/step_03.md b/docs/tutorials/fundamentals/1_understanding_gui/step_03/step_03.md index 358e02749..76f182f05 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/step_03/step_03.md +++ b/docs/tutorials/fundamentals/1_understanding_gui/step_03/step_03.md @@ -59,18 +59,6 @@ the callback function referenced in the `on_action` property. ```python from taipy.gui import Gui, notify - text = "Original text" - - # Definition of the page - page = """ - # Getting started with Taipy GUI - - My text: <|{text}|> - - <|{text}|input|> - - <|Run local|button|on_action=on_button_action|> - """ def on_button_action(state): notify(state, 'info', f'The text is: {state.text}') @@ -81,15 +69,28 @@ the callback function referenced in the `on_action` property. state.text = "" return + if __name__ == "__main__": + text = "Original text" + + # Definition of the page + page = """ + # Getting started with Taipy GUI - Gui(page).run(debug=True) + My text: <|{text}|> + + <|{text}|input|> + + <|Run local|button|on_action=on_button_action|> + """ + + Gui(page).run(debug=True) ``` === "Python" ```python + import taipy.gui.builder as tgb from taipy.gui import Gui, notify import taipy.gui.builder as tgb - text = "Original text" def on_button_action(state): notify(state, 'info', f'The text is: {state.text}') @@ -100,16 +101,18 @@ the callback function referenced in the `on_action` property. state.text = "" return - # Definition of the page - with tgb.Page() as page: - tgb.text("# Getting started with Taipy GUI", mode="md") - tgb.text("My text: {text}") + if __name__ == "__main__": + text = "Original text" - tgb.input("{text}") + # Definition of the page + with tgb.Page() as page: + tgb.text("# Getting started with Taipy GUI", mode="md") + tgb.text("My text: {text}") - tgb.button("Run local", on_action=on_button_action) + tgb.input("{text}") + tgb.button("Run local", on_action=on_button_action) - Gui(page).run(debug=True) + Gui(page).run(debug=True) ``` diff --git a/docs/tutorials/fundamentals/1_understanding_gui/step_04/step_04.md b/docs/tutorials/fundamentals/1_understanding_gui/step_04/step_04.md index 1f91a59f8..7d3746b14 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/step_04/step_04.md +++ b/docs/tutorials/fundamentals/1_understanding_gui/step_04/step_04.md @@ -29,12 +29,13 @@ You can also use Plotly Python to create a *Figure* object and inject it in the from taipy.gui import Gui import plotly.graph_objects as go - list_to_display = [100/x for x in range(1, 100)] - fig = go.Figure(data=go.Scatter(y=list_to_display)) + if __name__ == "__main__": + list_to_display = [100/x for x in range(1, 100)] + fig = go.Figure(data=go.Scatter(y=list_to_display)) - page = "<|chart|figure={fig}|>" + page = "<|chart|figure={fig}|>" - Gui(page).run() + Gui(page).run() ``` === "Python" ```python @@ -42,13 +43,14 @@ You can also use Plotly Python to create a *Figure* object and inject it in the import taipy.gui.builder as tgb import plotly.graph_objects as go - list_to_display = [100/x for x in range(1, 100)] - fig = go.Figure(data=go.Scatter(y=list_to_display)) + if __name__ == "__main__": + list_to_display = [100/x for x in range(1, 100)] + fig = go.Figure(data=go.Scatter(y=list_to_display)) - with tgb.Page() as page: - tgb.chart(figure="{fig}") + with tgb.Page() as page: + tgb.chart(figure="{fig}") - Gui(page).run() + Gui(page).run() ``` @@ -137,13 +139,11 @@ A chart is added to our code to visualize the score given by our NLP algorithm t <|{dataframe}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|> """ - dataframe = pd.DataFrame({"Text":['Test', 'Other', 'Love'], "Score Pos":[1, 1, 4], "Score Neu":[2, 3, 1], "Score Neg":[1, 2, 0], "Overall":[0, -1, 4]}) - ``` === "Python" ```python @@ -156,14 +156,11 @@ A chart is added to our code to visualize the score given by our NLP algorithm t y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", color__1="green", color__2="grey", color__3="red", type__4="line") - - dataframe = pd.DataFrame({"Text":['Test', 'Other', 'Love'], "Score Pos":[1, 1, 4], "Score Neu":[2, 3, 1], "Score Neg":[1, 2, 0], "Overall":[0, -1, 4]}) - ``` ## Quick tip to write visual elements @@ -208,7 +205,6 @@ graph shown above, you can to the following: ... tgb.chart("{dataframe}", properties=property_chart) - ``` ![Charts](images/result.png){ width=90% : .tp-image-border } diff --git a/docs/tutorials/fundamentals/1_understanding_gui/step_05/step_05.md b/docs/tutorials/fundamentals/1_understanding_gui/step_05/step_05.md index 8c9ae9e07..357250155 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/step_05/step_05.md +++ b/docs/tutorials/fundamentals/1_understanding_gui/step_05/step_05.md @@ -2,7 +2,6 @@ [Download the entire code](./../src/src.zip){: .tp-btn .tp-btn--accent target='blank' } - As shown before, parameters and variables in Taipy are dynamic. The same applies for every type of object, even data frames. Therefore, you can perform operations on data frames, and Taipy will show real-time results on the GUI. These changes occur through the `=` assignment like @@ -28,7 +27,7 @@ elements. It can be simple charts or tables, but it can also be an expression l ```python tgb.text("## Positive", mode="md") tgb.text("{np.mean(dataframe['Score Pos'])}") - + tgb.text("## Neutral", mode="md") tgb.text("{np.mean(dataframe['Score Neu'])}") @@ -41,14 +40,14 @@ This kind of expression creates direct connections between visual elements witho ## A use case for NLP - Part 1 -The code for NLP is provided here, although it's not directly related to Taipy. It will come +The code for NLP is provided here, although it's not directly related to Taipy. It will come into play in Part 2 when we wrap a GUI around this NLP engine. -Before executing this step, you should have `pip install torch` and `pip install transformers`. -The model will be downloaded and utilized in this code snippet. Note that Torch is currently +Before executing this step, you should have `pip install torch` and `pip install transformers`. +The model will be downloaded and utilized in this code snippet. Note that Torch is currently only accessible for Python versions between 3.8 and 3.10. -If you encounter difficulties installing these packages, you can simply provide a dictionary of +If you encounter difficulties installing these packages, you can simply provide a dictionary of random numbers as the output for the `analyze_text(text)` function. @@ -87,14 +86,6 @@ The code below uses this concept to create metrics on the data frame generated. import pandas as pd from taipy.gui import Gui, notify - text = "Original text" - - dataframe = pd.DataFrame({"Text": [""], - "Score Pos": [0.33], - "Score Neu": [0.33], - "Score Neg": [0.33], - "Overall": [0]}) - def local_callback(state): notify(state, "Info", f"The text is: {state.text}", True) @@ -104,8 +95,16 @@ The code below uses this concept to create metrics on the data frame generated. state.dataframe = temp state.text = "" + if __name__ == "__main__": + text = "Original text" + + dataframe = pd.DataFrame({"Text": [""], + "Score Pos": [0.33], + "Score Neu": [0.33], + "Score Neg": [0.33], + "Overall": [0]}) - page = """ + page = """ <|toggle|theme|> # Getting started with Taipy GUI @@ -128,40 +127,31 @@ The code below uses this concept to create metrics on the data frame generated. <|{dataframe}|table|> <|{dataframe}|chart|type=bar|x=Text|y[1]=Score Pos|y[2]=Score Neu|y[3]=Score Neg|y[4]=Overall|color[1]=green|color[2]=grey|color[3]=red|type[4]=line|> - """ + """ - Gui(page).run(debug=True) + Gui(page).run(debug=True) ``` === "Python" ```python - from transformers import AutoTokenizer, AutoModelForSequenceClassification - from scipy.special import softmax - import numpy as np import pandas as pd - from taipy.gui import Gui, notify - import taipy.gui.builder as tgb + from scipy.special import softmax + from transformers import AutoModelForSequenceClassification, AutoTokenizer - text = "Original text" + import taipy.gui.builder as tgb + from taipy.gui import Gui, notify # Model setup MODEL = "cardiffnlp/twitter-roberta-base-sentiment" tokenizer = AutoTokenizer.from_pretrained(MODEL) model = AutoModelForSequenceClassification.from_pretrained(MODEL) - # Initial dataframe - dataframe = pd.DataFrame({"Text":[''], - "Score Pos":[0.33], - "Score Neu":[0.33], - "Score Neg":[0.33], - "Overall":[0]}) - def analyze_text(text): # Run for Roberta Model encoded_text = tokenizer(text, return_tensors='pt') output = model(**encoded_text) scores = output[0][0].detach().numpy() scores = softmax(scores) - + return {"Text":text, "Score Pos":scores[2], "Score Neu":scores[1], @@ -176,33 +166,43 @@ The code below uses this concept to create metrics on the data frame generated. state.dataframe = temp state.text = "" - # Definition of the page with tgb - with tgb.Page() as page: - tgb.toggle(theme=True) + if __name__ == "__main__": + text = "Original text" + + # Initial dataframe + dataframe = pd.DataFrame({"Text":[''], + "Score Pos":[0.33], + "Score Neu":[0.33], + "Score Neg":[0.33], + "Overall":[0]}) + + # Definition of the page with tgb + with tgb.Page() as page: + tgb.toggle(theme=True) + + tgb.text("# Getting started with Taipy GUI", mode="md") + tgb.text("My text: {text}") - tgb.text("# Getting started with Taipy GUI", mode="md") - tgb.text("My text: {text}") + tgb.input("{text}") + tgb.button("Analyze", on_action=local_callback) - tgb.input("{text}") - tgb.button("Analyze", on_action=local_callback) + # Displaying sentiment scores and overall sentiment + tgb.text("## Positive", mode="md") + tgb.text("{np.mean(dataframe['Score Pos'])}", format="%.2f") - # Displaying sentiment scores and overall sentiment - tgb.text("## Positive", mode="md") - tgb.text("{np.mean(dataframe['Score Pos'])}") - - tgb.text("## Neutral", mode="md") - tgb.text("{np.mean(dataframe['Score Neu'])}") + tgb.text("## Neutral", mode="md") + tgb.text("{np.mean(dataframe['Score Neu'])}", format="%.2f") - tgb.text("## Negative", mode="md") - tgb.text("{np.mean(dataframe['Score Neg'])}") + tgb.text("## Negative", mode="md") + tgb.text("{np.mean(dataframe['Score Neg'])}", format="%.2f") - tgb.table("{dataframe}", number_format="%.2f") - tgb.chart("{dataframe}", type="bar", x="Text", - y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", - color__1="green", color__2="grey", color__3="red", type__4="line") + tgb.table("{dataframe}", number_format="%.2f") + tgb.chart("{dataframe}", type="bar", x="Text", + y__1="Score Pos", y__2="Score Neu", y__3="Score Neg", y__4="Overall", + color__1="green", color__2="grey", color__3="red", type__4="line") - # Initialize the GUI with the updated dataframe - Gui(page).run(debug=True) + # Initialize the GUI with the updated dataframe + Gui(page).run(debug=True) ``` diff --git a/docs/tutorials/fundamentals/1_understanding_gui/step_07/step_07.md b/docs/tutorials/fundamentals/1_understanding_gui/step_07/step_07.md index 1d3d654be..d29a39729 100644 --- a/docs/tutorials/fundamentals/1_understanding_gui/step_07/step_07.md +++ b/docs/tutorials/fundamentals/1_understanding_gui/step_07/step_07.md @@ -2,7 +2,6 @@ [Download the entire code](./../src/src.zip){: .tp-btn .tp-btn--accent target='blank' } - Taipy significantly simplifies the process of building a multi-page application. To create a multi-page application, you need to define a dictionary of pages. In this example, we will create three pages: a *root* page and two additional pages (page 1 & page 2). We will incorporate @@ -16,42 +15,44 @@ could have one page created with Markdown and another with the Python API. ```python from taipy import Gui - # Add a navbar to switch from one page to the other - root_md = """ - <|navbar|> - # Multi-page application - """ - page1_md = "## This is page 1" - page2_md = "## This is page 2" - - pages = { - "/": root_md, - "page1": page1_md, - "page2": page2_md - } - Gui(pages=pages).run() + if __name__ == "__main__": + # Add a navbar to switch from one page to the other + root_md = """ + <|navbar|> + # Multi-page application + """ + page1_md = "## This is page 1" + page2_md = "## This is page 2" + + pages = { + "/": root_md, + "page1": page1_md, + "page2": page2_md + } + Gui(pages=pages).run() ``` === "Python" ```python from taipy import Gui import taipy.gui.builder as tgb - # Add a navbar to switch from one page to the other - with tgb.Page() as root_page: - tgb.navbar() - tgb.text("# Multi-page application", mode="md") - - with tgb.Page() as page_1: - tgb.text("## This is page 1", mode="md") - with tgb.Page() as page_2: - tgb.text("## This is page 2", mode="md") - - pages = { - "/": root_page, - "page1": page_1, - "page2": page_2 - } - Gui(pages=pages).run() + if __name__ == "__main__": + # Add a navbar to switch from one page to the other + with tgb.Page() as root_page: + tgb.navbar() + tgb.text("# Multi-page application", mode="md") + + with tgb.Page() as page_1: + tgb.text("## This is page 1", mode="md") + with tgb.Page() as page_2: + tgb.text("## This is page 2", mode="md") + + pages = { + "/": root_page, + "page1": page_1, + "page2": page_2 + } + Gui(pages=pages).run() ``` ## Navigating between pages @@ -75,23 +76,22 @@ For example, this code creates a menu with two options: from taipy.gui import Gui, navigate - root_md="<|menu|label=Menu|lov={[('Page-1', 'Page 1'), ('Page-2', 'Page 2')]}|on_action=menu_option_selected|>" - page1_md="## This is page 1" - page2_md="## This is page 2" - - def menu_option_selected(state, action, info): page = info["args"][0] navigate(state, to=page) + if __name__ == "__main__": + root_md="<|menu|label=Menu|lov={[('Page-1', 'Page 1'), ('Page-2', 'Page 2')]}|on_action=menu_option_selected|>" + page1_md="## This is page 1" + page2_md="## This is page 2" - pages = { - "/": root_md, - "Page-1": page1_md, - "Page-2": page2_md - } + pages = { + "/": root_md, + "Page-1": page1_md, + "Page-2": page2_md + } - Gui(pages=pages).run() + Gui(pages=pages).run() ``` === "Python" ```python @@ -103,23 +103,24 @@ For example, this code creates a menu with two options: page = info["args"][0] navigate(state, to=page) - # Add a navbar to switch from one page to the other - with tgb.Page() as root_page: - tgb.menu(label="Menu", - lov=[('Page-1', 'Page 1'), ('Page-2', 'Page 2')], - on_action=menu_option_selected) - - with tgb.Page() as page_1: - tgb.text("## This is page 1", mode="md") - with tgb.Page() as page_2: - tgb.text("## This is page 2", mode="md") - - pages = { - "/": root_page, - "page1": page_1, - "page2": page_2 - } - Gui(pages=pages).run() + if __name__ == "__main__": + # Add a navbar to switch from one page to the other + with tgb.Page() as root_page: + tgb.menu(label="Menu", + lov=[('Page-1', 'Page 1'), ('Page-2', 'Page 2')], + on_action=menu_option_selected) + + with tgb.Page() as page_1: + tgb.text("## This is page 1", mode="md") + with tgb.Page() as page_2: + tgb.text("## This is page 2", mode="md") + + pages = { + "/": root_page, + "page1": page_1, + "page2": page_2 + } + Gui(pages=pages).run() ``` ![Menu](images/menu.png){ width=40% : .tp-image-border } @@ -131,39 +132,41 @@ through the Taipy pages by default ```python from taipy import Gui - # Add a navbar to switch from one page to the other - root_md = "<|navbar|>" - page1_md = "## This is page 1" - page2_md = "## This is page 2" - - pages = { - "/": root_md, - "page1": page1_md, - "page2": page2_md - } - Gui(pages=pages).run() + if __name__ == "__main__": + # Add a navbar to switch from one page to the other + root_md = "<|navbar|>" + page1_md = "## This is page 1" + page2_md = "## This is page 2" + + pages = { + "/": root_md, + "page1": page1_md, + "page2": page2_md + } + Gui(pages=pages).run() ``` === "Python" ```python from taipy import Gui import taipy.gui.builder as tgb - # Add a navbar to switch from one page to the other - with tgb.Page() as root_page: - tgb.navbar() - tgb.text("# Multi-page application", mode="md") - - with tgb.Page() as page_1: - tgb.text("## This is page 1", mode="md") - with tgb.Page() as page_2: - tgb.text("## This is page 2", mode="md") - - pages = { - "/": root_page, - "page1": page_1, - "page2": page_2 - } - Gui(pages=pages).run() + if __name__ == "__main__": + # Add a navbar to switch from one page to the other + with tgb.Page() as root_page: + tgb.navbar() + tgb.text("# Multi-page application", mode="md") + + with tgb.Page() as page_1: + tgb.text("## This is page 1", mode="md") + with tgb.Page() as page_2: + tgb.text("## This is page 2", mode="md") + + pages = { + "/": root_page, + "page1": page_1, + "page2": page_2 + } + Gui(pages=pages).run() ``` ![Navbar](images/navbar.png){ width=40% : .tp-image-border } diff --git a/docs/tutorials/fundamentals/2_scenario_management_overview/index.md b/docs/tutorials/fundamentals/2_scenario_management_overview/index.md index f18af7a88..664c59cd2 100644 --- a/docs/tutorials/fundamentals/2_scenario_management_overview/index.md +++ b/docs/tutorials/fundamentals/2_scenario_management_overview/index.md @@ -156,16 +156,17 @@ configuration. Still, no scenario has been run yet. `tp.submit()` is t that triggers the run of all the scenario-related tasks. ```python -# Run of the Core -tp.Core().run() +if __name__ == "__main__": + # Run of the Core + tp.Core().run() -# Creation of the scenario and execution -scenario = tp.create_scenario(scenario_cfg) -scenario.historical_temperature.write(data) -scenario.date_to_forecast.write(dt.datetime.now()) -tp.submit(scenario) + # Creation of the scenario and execution + scenario = tp.create_scenario(scenario_cfg) + scenario.historical_temperature.write(data) + scenario.date_to_forecast.write(dt.datetime.now()) + tp.submit(scenario) -print("Value at the end of task", scenario.predictions.read()) + print("Value at the end of task", scenario.predictions.read()) ``` Results: @@ -259,20 +260,21 @@ Add these few lines to the code of your script. This creates a web application, state.refresh('scenario') tp.gui.notify(state, "s", "Saved! Ready to submit") - date = None - with tgb.Page() as scenario_page: - tgb.scenario_selector("{scenario}") - tgb.text("Select a Date") - tgb.date("{date}", on_change=save, active="{scenario}") + if __name__ == "__main__": + date = None + with tgb.Page() as scenario_page: + tgb.scenario_selector("{scenario}") + tgb.text("Select a Date") + tgb.date("{date}", on_change=save, active="{scenario}") - tgb.text("Run the scenario") - tgb.scenario("{scenario}") - tgb.scenario_dag("{scenario}") + tgb.text("Run the scenario") + tgb.scenario("{scenario}") + tgb.scenario_dag("{scenario}") - tgb.text("View all the information on your prediction here") - tgb.data_node("{scenario.predictions}") + tgb.text("View all the information on your prediction here") + tgb.data_node("{scenario.predictions}") - tp.Gui(scenario_page).run() + tp.Gui(scenario_page).run() ``` The diff --git a/docs/tutorials/scenario_management/1_scenarios/index.md b/docs/tutorials/scenario_management/1_scenarios/index.md index 111b4802d..ed3754700 100644 --- a/docs/tutorials/scenario_management/1_scenarios/index.md +++ b/docs/tutorials/scenario_management/1_scenarios/index.md @@ -91,29 +91,30 @@ it is possible to export them with the last command. ```python ... -# Run of the Core service -tp.Core().run() +if __name__ == "__main__": + # Run of the Core service + tp.Core().run() -# Get a scenario by id -scenario_retrieved = tp.get(scenario.id) + # Get a scenario by id + scenario_retrieved = tp.get(scenario.id) -# Get all scenarios -all_scenarios = tp.get_scenarios() + # Get all scenarios + all_scenarios = tp.get_scenarios() -# Get primary scenarios -all_primary_scenarios = tp.get_primary_scenarios() + # Get primary scenarios + all_primary_scenarios = tp.get_primary_scenarios() -# Promote a scenario as primary -tp.set_primary(scenario) + # Promote a scenario as primary + tp.set_primary(scenario) -# Compare scenarios (use the compare function defined in the configuration) -comparison_results = tp.compare_scenarios(january_scenario, february_scenario, data_node_config_id="sales_predictions") + # Compare scenarios (use the compare function defined in the configuration) + comparison_results = tp.compare_scenarios(january_scenario, february_scenario, data_node_config_id="sales_predictions") -# Tag a scenario -tp.tag(scenario, "my_tag") + # Tag a scenario + tp.tag(scenario, "my_tag") -# Export a scenario -tp.export(scenario.id, folder_path="./monthly_scenario") + # Export a scenario + tp.export(scenario.id, folder_path="./monthly_scenario") ``` The primary benefit of having a scenario is to access the Data Nodes of the different scenarios @@ -141,16 +142,16 @@ import taipy as tp ... -scenario = None +if __name__ == "__main__": + scenario = None -scenario_md = """ -<|{scenario}|scenario_selector|> -<|{scenario}|scenario|> -<|{scenario}|scenario_dag|> -""" - -tp.Core().run() -Gui(scenario_md).run() + scenario_md = """ + <|{scenario}|scenario_selector|> + <|{scenario}|scenario|> + <|{scenario}|scenario_dag|> + """ + tp.Core().run() + Gui(scenario_md).run() ``` # Conclusion diff --git a/docs/tutorials/scenario_management/2_the_data_nodes/index.md b/docs/tutorials/scenario_management/2_the_data_nodes/index.md index f204c8ea3..cf1f086a3 100644 --- a/docs/tutorials/scenario_management/2_the_data_nodes/index.md +++ b/docs/tutorials/scenario_management/2_the_data_nodes/index.md @@ -82,16 +82,16 @@ Taipy makes things easy by handling the paths for Pickle files automatically if defined them. This simplifies the configuration process. When you create several scenarios, the output data nodes from each scenario will automatically point to separate files. -```py +```python scenario_2 = tp.create_scenario(scenario_cfg) tp.submit(scenario_2) ``` -In this example, when we create a second scenario, it also brings in a new pair of data nodes: -*model* and *predictions*. The *model* data node still points to the same Pickle file because -its path was set by the developer in advance. However, the new *predictions* data node points -to a different Pickle file. Taipy creates this new Pickle file on the fly during runtime, -so it's separate from the one used in the first scenario. All data nodes that writes in +In this example, when we create a second scenario from the same main script, it also brings in +a new pair of data nodes: *model* and *predictions*. The *model* data node still points to the +same Pickle file because its path was set by the developer in advance. However, the new *predictions* +data node points to a different Pickle file. Taipy creates this new Pickle file on the fly during +runtime, so it's separate from the one used in the first scenario. All data nodes that writes in the local system share this behavior. ## Tabular data nodes @@ -119,7 +119,7 @@ note that you can change this path during runtime. For instance, if you create a you can instruct the Tabular data nodes to save the results in a different file or directory, thereby preventing the overwriting of previous data. Taipy can also manage file destinations in cases where no 'default_path' has been specified. -```py +```python scenario = tp.create_scenario(scenario_cfg) tp.submit(scenario) ``` diff --git a/docs/tutorials/scenario_management/3_skippable_tasks/index.md b/docs/tutorials/scenario_management/3_skippable_tasks/index.md index cd4c4b982..5cb6eb607 100644 --- a/docs/tutorials/scenario_management/3_skippable_tasks/index.md +++ b/docs/tutorials/scenario_management/3_skippable_tasks/index.md @@ -108,13 +108,13 @@ task_cfg = Config.configure_task("multiply_and_add", With the code below, we create and submit an instance of this scenario configuration. -```py +```python scenario = tp.create_scenario(scenario_cfg) tp.submit(scenario) print("Results (sum):", scenario.sum.read()) ``` -```py +```bash [...] [Taipy] [INFO] job JOB_multiply_and_add_... is completed. Results (sum): 23 @@ -125,7 +125,7 @@ The task associated with my Task has been completed, which means that my functio The line below is resubmitting the scenario, but please note that I haven't made any changes to my input Data nodes in any way. -```py +```python tp.submit(scenario) print("Results (sum):", scenario.sum.read()) ``` @@ -136,13 +136,13 @@ If there are multiple tasks in this scenario, Taipy may skip several of them. The code below shows what happens when we submit the scenario after making a change to an input Data node. In this case, the value of *nb_1* is updated from 21 to 42. -```py +```python scenario.nb_1.write(42) tp.submit(scenario) print("Results (sum):", scenario.sum.read()) ``` -```py +```bash [...] [Taipy] [INFO] job JOB_multiply_and_add_... is completed. Results (sum): 44 @@ -167,7 +167,7 @@ Let's revisit our previous code and modify the Data nodes to have a Global scope Your browser does not support the video tag. -```py +```python from taipy.config import Config, Scope nb_1_cfg = Config.configure_data_node('nb1', scope=Scope.GLOBAL) @@ -183,18 +183,15 @@ scenario_cfg = Config.configure_scenario("scenario", [task_cfg]) The first line creates a scenario consisting of Data nodes, and tasks. Following this, we submit it. -```py +```python scenario_1 = tp.create_scenario(scenario_cfg) tp.submit(scenario_1) print("Results (sum):", scenario_1.sum.read()) ``` -```py +```bash [...] [Taipy] [INFO] job JOB_task_multiply_and_add_... is completed. -``` - -```py Results (sum): 23 ``` @@ -204,13 +201,13 @@ Now, let's create another scenario. This new scenario won't create new Global Data nodes (both input and output). Instead, it will reuse the ones that were created by *scenario_1*. -```py +```python scenario_2 = tp.create_scenario(scenario_cfg) tp.submit(scenario_2) print("Results (sum):", scenario_2.sum.read()) ``` -```py +```bash [...] [Taipy] [INFO] job JOB_task_multiply_and_add_... is skipped. Results (sum): 23 diff --git a/docs/tutorials/scenario_management/4_cycles_scopes/index.md b/docs/tutorials/scenario_management/4_cycles_scopes/index.md index e9dc61a4a..5c496a12b 100644 --- a/docs/tutorials/scenario_management/4_cycles_scopes/index.md +++ b/docs/tutorials/scenario_management/4_cycles_scopes/index.md @@ -262,39 +262,39 @@ different configurations to gain deeper insights into their functionalities and # Entire code ```python -from taipy.config import Config, Frequency, Scope -import taipy as tp import datetime as dt + import pandas as pd +import taipy as tp +from taipy.config import Config, Frequency, Scope + def filter_by_month(df, month): df['Date'] = pd.to_datetime(df['Date']) df = df[df['Date'].dt.month == month] return df +if __name__ == '__main__': + historical_data_cfg = Config.configure_csv_data_node(id="historical_data", + default_path="time_series.csv", + scope=Scope.GLOBAL) + month_cfg = Config.configure_data_node(id="month", + scope=Scope.CYCLE) + month_values_cfg = Config.configure_data_node(id="month_data", + scope=Scope.CYCLE) -historical_data_cfg = Config.configure_csv_data_node(id="historical_data", - default_path="time_series.csv", - scope=Scope.GLOBAL) -month_cfg = Config.configure_data_node(id="month", - scope=Scope.CYCLE) -month_values_cfg = Config.configure_data_node(id="month_data", - scope=Scope.CYCLE) - - -task_filter_cfg = Config.configure_task(id="filter_by_month", - function=filter_by_month, - input=[historical_data_cfg, month_cfg], - output=month_values_cfg) + task_filter_cfg = Config.configure_task(id="filter_by_month", + function=filter_by_month, + input=[historical_data_cfg, month_cfg], + output=month_values_cfg) -scenario_cfg = Config.configure_scenario(id="my_scenario", - task_configs=[task_filter_cfg], - frequency=Frequency.MONTHLY) + scenario_cfg = Config.configure_scenario(id="my_scenario", + task_configs=[task_filter_cfg], + frequency=Frequency.MONTHLY) -if __name__ == '__main__': tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg, diff --git a/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle.py b/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle.py index 1428b5ae8..da1c2e3c4 100644 --- a/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle.py +++ b/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle.py @@ -1,37 +1,38 @@ -from taipy.config import Config, Frequency, Scope -import taipy as tp import datetime as dt + import pandas as pd +import taipy as tp +from taipy.config import Config, Frequency, Scope + def filter_by_month(df, month): - df['Date'] = pd.to_datetime(df['Date']) + df['Date'] = pd.to_datetime(df['Date']) df = df[df['Date'].dt.month == month] return df - -historical_data_cfg = Config.configure_csv_data_node(id="historical_data", - default_path="time_series.csv", - scope=Scope.GLOBAL) -month_cfg = Config.configure_data_node(id="month", - scope=Scope.CYCLE) -month_values_cfg = Config.configure_data_node(id="month_data", - scope=Scope.CYCLE) +if __name__ == '__main__': + historical_data_cfg = Config.configure_csv_data_node(id="historical_data", + default_path="time_series.csv", + scope=Scope.GLOBAL) + month_cfg = Config.configure_data_node(id="month", + scope=Scope.CYCLE) + month_values_cfg = Config.configure_data_node(id="month_data", + scope=Scope.CYCLE) -task_filter_cfg = Config.configure_task(id="filter_by_month", - function=filter_by_month, - input=[historical_data_cfg, month_cfg], - output=month_values_cfg) + task_filter_cfg = Config.configure_task(id="filter_by_month", + function=filter_by_month, + input=[historical_data_cfg, month_cfg], + output=month_values_cfg) -scenario_cfg = Config.configure_scenario(id="my_scenario", - task_configs=[task_filter_cfg], - frequency=Frequency.MONTHLY) + scenario_cfg = Config.configure_scenario(id="my_scenario", + task_configs=[task_filter_cfg], + frequency=Frequency.MONTHLY) -Config.export('step_04/onfig.toml') + Config.export('step_04/onfig.toml') -if __name__ == '__main__': tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg, @@ -47,7 +48,7 @@ def filter_by_month(df, month): print("Month Data Node of Scenario 2:", scenario_2.month.read()) scenario_1.submit() - + before_set_1 = scenario_1.is_primary before_set_2 = scenario_2.is_primary @@ -63,4 +64,3 @@ def filter_by_month(df, month): <|{scenario}|scenario|> <|{scenario}|scenario_dag|> <|{data_node}|data_node_selector|>""").run() - \ No newline at end of file diff --git a/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle.zip b/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle.zip index 8ff4abf84485aeaa7833023c3ab5b34915ccdf27..3bb89647f75afc6e90c46a19267450d96d41a7ba 100644 GIT binary patch literal 143295 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%0D*_Pd$A7FWLT^BcFmOUj;`l^0bj@Y$2;j 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%0D_i{5^ok4 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 diff --git a/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle_toml.py b/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle_toml.py index b571899aa..f3b6f547b 100644 --- a/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle_toml.py +++ b/docs/tutorials/scenario_management/4_cycles_scopes/src/scope_and_cycle_toml.py @@ -1,19 +1,20 @@ -from taipy.config import Config, Frequency, Scope -import taipy as tp import datetime as dt + import pandas as pd +import taipy as tp +from taipy.config import Config + def filter_by_month(df, month): - df['Date'] = pd.to_datetime(df['Date']) + df['Date'] = pd.to_datetime(df['Date']) df = df[df['Date'].dt.month == month] return df - -Config.load('config.toml') -scenario_cfg = Config.scenarios["my_scenario"] - if __name__ == '__main__': + Config.load('config.toml') + scenario_cfg = Config.scenarios["my_scenario"] + tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg, @@ -29,7 +30,7 @@ def filter_by_month(df, month): print("Month Data Node of Scenario 2:", scenario_2.month.read()) scenario_1.submit() - + before_set_1 = scenario_1.is_primary before_set_2 = scenario_2.is_primary @@ -45,4 +46,3 @@ def filter_by_month(df, month): <|{scenario}|scenario|> <|{scenario}|scenario_dag|> <|{data_node}|data_node_selector|>""").run() - \ No newline at end of file diff --git a/docs/tutorials/scenario_management/5_job_execution/src/job_execution.py b/docs/tutorials/scenario_management/5_job_execution/src/job_execution.py index de6c229b5..b0e33c2e3 100644 --- a/docs/tutorials/scenario_management/5_job_execution/src/job_execution.py +++ b/docs/tutorials/scenario_management/5_job_execution/src/job_execution.py @@ -1,9 +1,9 @@ -from taipy.core.config import Config -import taipy as tp -import datetime as dt -import pandas as pd import time +import taipy as tp +from taipy.core.config import Config + + # Normal function used by Taipy def double(nb): return nb * 2 @@ -13,32 +13,32 @@ def add(nb): time.sleep(10) return nb + 10 -Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) +if __name__=="__main__": + Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) -# Configuration of Data Nodes -input_cfg = Config.configure_data_node("my_input", default_data=21) -intermediate_cfg = Config.configure_data_node("intermediate", default_data=21) -output_cfg = Config.configure_data_node("my_output") + # Configuration of Data Nodes + input_cfg = Config.configure_data_node("my_input", default_data=21) + intermediate_cfg = Config.configure_data_node("intermediate", default_data=21) + output_cfg = Config.configure_data_node("my_output") -# Configuration of tasks -first_task_cfg = Config.configure_task("double", - double, - input_cfg, - intermediate_cfg) + # Configuration of tasks + first_task_cfg = Config.configure_task("double", + double, + input_cfg, + intermediate_cfg) -second_task_cfg = Config.configure_task("add", - add, - intermediate_cfg, - output_cfg) + second_task_cfg = Config.configure_task("add", + add, + intermediate_cfg, + output_cfg) -# Configuration of the scenario -scenario_cfg = Config.configure_scenario(id="my_scenario", - task_configs=[first_task_cfg, - second_task_cfg]) + # Configuration of the scenario + scenario_cfg = Config.configure_scenario(id="my_scenario", + task_configs=[first_task_cfg, + second_task_cfg]) -Config.export("config.toml") + Config.export("config.toml") -if __name__=="__main__": tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg) scenario_2 = tp.create_scenario(scenario_cfg) diff --git a/docs/tutorials/scenario_management/5_job_execution/src/job_execution.zip b/docs/tutorials/scenario_management/5_job_execution/src/job_execution.zip index 416a9954c1c1d198f00e885933a89c41d5dbf1d4..edfaae2dd492079125783fe97ac438a92b51c493 100644 GIT binary patch literal 1669 zcmWIWW@Zs#-~d9!y5$iJP*BFiz`)I*z>u7umzJ5XSCXHb6B@$H!2bW0Wg6RS%QO&O zTEWf0$nuqufdOa$14Hkm(^)MBB5mI*xlZolcpLQM&^e!jVp~GYT~%a!TN3ol#Bc4Z z6+S-GFR|t3(+~0I+$U{2*}c7=Z{fG4Rj(#onWEayxs6YRb)o2Ck3;5xwilIuUP?eK;h@#V7Xsuj%S!H=|PrH{KSywR@@TR^Pb& z%R+v~wY+$7^}&uXL${7Ooh<7(BEP;-N#1h6^^@7b)0V6GcQ0GvRdan|^3TY>$-7N% zcAhtGxwhlAWJ_w~`mG1lRTh-YR_~Z?aQ*t(PX}ipg z%-m@G=Xa((=qL}AbCdIQ)X8@W`624P?e+?PcHMM?2U|AImOE`{8_dkz7a!ow&e3sc zxv>Z^kU&8i01xaF5kKI8eHthu3JmP5{G|BQiqz!NlFaXzvghojQ?dl^ z-2J}8->9s_&dEef(l~qJnF=ORg}yc4&*}AUDwg}~y0@}jbmwgCV>e`Ntn;rj)GpGK za-YDImEpf({tlmH{##4S92|2$9#N3*H>_mJdMKA=<~-%v^`9?zT@S`j=?utKO!#(< zk;ivKx1fI72ayFl%#Soy8A@Ynn00(h^7lj(G<$Y zz#xDgO|Td`35=OjKn$YMV<_Zw*Bt|aJ+HN;-X8U1+bnlN^}*$LmHyn8Eea{C_Xb{@ z)Fb!i%zgK1Hu~+JIg6SXu3eQCx^iO3;*D~9LOeR=aO)jcE?}=y*=wrxe}z@DVO@#- z{RB6=rCkD_81#>6**VCUJYRZIK!z)$|ASRw=K;AE&bJM%d8gO2Jlgc4`Ran`A1u|A z6k<9~|I1kVjrH%brR~22WscoD)Obbs&7F>EoHmjx?lf44eNEnZ;lIq!i?RGYnd>HO zT(+=BQ_nQn#Qd~hTJ=Gt->Fe;>~9WTIU;(BBWK0u7;Za>-V*jM`5AdLU*2rr_&y_c zv%aTL^^B)YPc^wOA2$AOlcsV(wdG3khc&P7FZj86Ye&Q~!j_v3A@|wPc}KY-Y)vsrQh3Z%irHD)L;8KXVrU8|7zB=!A|9!ThdYw zRsFI2r90*Jl=S_TO5qh@QIAhk+%HBFt!35Rn-Iyjg+a!@$4{gi=5!hO&Zq0C69x A#Q*>R literal 1486 zcmWIWW@Zs#U|`^22<>o-uwV9%QHqg)VLB5712<4KIX^EgGhMGFKR2g$l5cjifyD9m zt##}tD>-fl-Z;2b?2g0nFGfpR+=Ufqh));aR{LA^)h*Gqm%1lE*Z<7CbS3lOuev*V z+h#x8S@Vf|AxE#Aa*B=zQ;cWVAH|x)n@Lw6`!8i*O`8{*)qeXYp4JR+& zY}a-{PG1re*wIP03{)VHtp=vb>kBznfwUC}gjV*Hffcz-hkPt7h> zoxjC1&m6znwIeu*g*Pm-*fsS<`{GTD9X~S%pah}CxtNrnz#zlGiK%8J0X3B@K9M+F}=ZYA8OHOer|k(o`$1b>N$z%_NzZjx$?kZ{BFM_;Rt< zePzC*-!|^?`{cl*>HRIiNX_cW{@lYK8*+VO_FV`|I$Pt>RGmE`*P)x)oOioy{pNR~ zbJv%rUfVlA;>e0yWgk?U6wFnsicazve%MysD0MGYbv~;(i_VRX#U@MQkJ$Buf6a?l zYisaZ91=2RcZc7H`cF3{-c<*&ZHm@v{;*zUL-0BFd1l)+F2^1$dU;cA`jft?%Ass=o)^VleU)DM?fEh1S^li2Jy$1`&aaLvJ+MO(yX{u?aysHMQD-a^exYtYc}luzwhL$TdCC=OO+1osZ6_frf2b0 zAsgXmE^N7mbyqaLDJ;2o?eI65r#FS>Stju9i8MWDQ>AEl^3M8AiCylh``YTCyX&3* z^oB2P%ha4E!xaa)*D6>%xiCLry3D7Z#~d;3b%(sZel4EoSfleRL3D-OyM?}~LPst3 zJN1a33O}kXEH}%&K;rg8z80@Lufnbv&t2zyrzK<6vyJ;qD?3CddCxl=tS~ukkJfWW z!Szo=uD!mwhOPUH^LLSci42%p4APNYON<(yw=(!%G9HP+~R2HC>0qDBX69Ynb7BG3B=!PYY V0B=@c0mHz+41~LY^gk954*<`Pfp-7^ diff --git a/docs/tutorials/scenario_management/5_job_execution/src/job_execution_toml.py b/docs/tutorials/scenario_management/5_job_execution/src/job_execution_toml.py index eea150271..4e5fcfa18 100644 --- a/docs/tutorials/scenario_management/5_job_execution/src/job_execution_toml.py +++ b/docs/tutorials/scenario_management/5_job_execution/src/job_execution_toml.py @@ -1,9 +1,9 @@ -from taipy.core.config import Config -import taipy as tp -import datetime as dt -import pandas as pd import time +import taipy as tp +from taipy.core.config import Config + + # Normal function used by Taipy def double(nb): return nb * 2 @@ -13,13 +13,11 @@ def add(nb): time.sleep(10) return nb + 10 - -Config.load('config.toml') -Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) - - if __name__=="__main__": - scenario_cfg = Config.scenarios['my_scenario'] + Config.load("config.toml") + Config.configure_job_executions(mode="standalone", max_nb_of_workers=2) + + scenario_cfg = Config.scenarios["my_scenario"] tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg) scenario_2 = tp.create_scenario(scenario_cfg) diff --git a/docs/tutorials/scenario_management/6_scenario_comparison/index.md b/docs/tutorials/scenario_management/6_scenario_comparison/index.md index 7c88c2a33..9b976188b 100644 --- a/docs/tutorials/scenario_management/6_scenario_comparison/index.md +++ b/docs/tutorials/scenario_management/6_scenario_comparison/index.md @@ -48,22 +48,23 @@ def compare_revenue(*revenues): Now, the `compare_scenarios` can be used within Taipy. ```python -core = tp.Core() -core.run() +if __name__ == "__main__": + core = tp.Core() + core.run() -# Create scenarios with different pricing strategies -scenario_1 = tp.create_scenario(scenario_cfg) -scenario_2 = tp.create_scenario(scenario_cfg) + # Create scenarios with different pricing strategies + scenario_1 = tp.create_scenario(scenario_cfg) + scenario_2 = tp.create_scenario(scenario_cfg) -scenario_1.price_input.write(120) # Higher price scenario -scenario_2.price_input.write(80) # Lower price scenario + scenario_1.price_input.write(120) # Higher price scenario + scenario_2.price_input.write(80) # Lower price scenario -scenario_1.submit() -scenario_2.submit() + scenario_1.submit() + scenario_2.submit() -# Compare the scenarios -comparisons = tp.compare_scenarios(scenario_1, scenario_2) -print(comparisons) + # Compare the scenarios + comparisons = tp.compare_scenarios(scenario_1, scenario_2) + print(comparisons) ``` Results: @@ -77,15 +78,15 @@ Results: # Compare Scenario with a GUI -Taipy can then generate a GUI that compares scenarios easily. Our comparison will be shown through +Taipy can then generate a GUI that compares scenarios easily. Our comparison will be shown through a chart and a table in this case. This application can be as interactive and complete as possible. ```python -from taipy.gui import Gui -import taipy.gui.builder as tgb +from taipy.gui import Gui +import taipy.gui.builder as tgb with tgb.Page() as compare_page: - tgb.text("# Compare Scenarios", mode="md) + tgb.text("# Compare Scenarios", mode="md") tgb.chart("{comparisons_revenue}", type="bar", x="Scenarios", y="Revenues") tgb.table("{comparisons_revenue}") @@ -100,10 +101,14 @@ Gui(compare_page).run() Here is the entire code to recreate the example. A GUI has been created to show the results. ```python -from taipy import Core, Config -import taipy as tp -import pandas as pd import numpy as np +import pandas as pd + +import taipy as tp +import taipy.gui.builder as tgb +from taipy import Config +from taipy.gui import Gui + # Simulation function to predict sales based on pricing def predict_sales(price): @@ -121,26 +126,6 @@ def predict_sales(price): def calculate_revenue(price, sales_volume): return price * sales_volume -# Data Node configuration -price_input_cfg = Config.configure_data_node("price_input", default_data=100) -sales_output_cfg = Config.configure_data_node("sales_output") -revenue_output_cfg = Config.configure_data_node("revenue_output") - -# Task configurations -predict_sales_task_cfg = Config.configure_task( - id="predict_sales", - function=predict_sales, - input=price_input_cfg, - output=sales_output_cfg -) - -calculate_revenue_task_cfg = Config.configure_task( - id="calculate_revenue", - function=calculate_revenue, - input=[price_input_cfg, sales_output_cfg], - output=revenue_output_cfg -) - # Comparator function to compare revenue outputs def compare_revenue(*revenues): scenario_names = [f"Scenario {i}" for i in range(len(revenues))] @@ -148,17 +133,35 @@ def compare_revenue(*revenues): "Revenues": list(revenues)} return pd.DataFrame(comparisons) -# Scenario configuration -scenario_cfg = Config.configure_scenario( - id="pricing_strategy", - task_configs=[predict_sales_task_cfg, calculate_revenue_task_cfg], - comparators={revenue_output_cfg.id: compare_revenue} -) - -Config.export("config_pricing.toml") - if __name__=="__main__": - core = Core() + # Data Node configuration + price_input_cfg = Config.configure_data_node("price_input", default_data=100) + sales_output_cfg = Config.configure_data_node("sales_output") + revenue_output_cfg = Config.configure_data_node("revenue_output") + + # Task configurations + predict_sales_task_cfg = Config.configure_task( + id="predict_sales", + function=predict_sales, + input=price_input_cfg, + output=sales_output_cfg + ) + + calculate_revenue_task_cfg = Config.configure_task( + id="calculate_revenue", + function=calculate_revenue, + input=[price_input_cfg, sales_output_cfg], + output=revenue_output_cfg + ) + + # Scenario configuration + scenario_cfg = Config.configure_scenario( + id="pricing_strategy", + task_configs=[predict_sales_task_cfg, calculate_revenue_task_cfg], + comparators={revenue_output_cfg.id: compare_revenue} + ) + + core = tp.Core() core.run() # Create scenarios with different pricing strategies @@ -170,19 +173,15 @@ if __name__=="__main__": scenario_1.submit() scenario_2.submit() - + # Compare the scenarios comparisons = tp.compare_scenarios(scenario_1, scenario_2) print(comparisons) comparisons_revenue = comparisons["revenue_output"]['compare_revenue'] - # Creation of an GUI - from taipy.gui import Gui - import taipy.gui.builder as tgb - with tgb.Page() as compare_page: - tgb.text("# Compare Scenarios", mode="md) + tgb.text("# Compare Scenarios", mode="md") tgb.chart("{comparisons_revenue}", type="bar", x="Scenarios", y="Revenues") tgb.table("{comparisons_revenue}") diff --git a/docs/tutorials/scenario_management/6_scenario_comparison/src/scenario_comparison.py b/docs/tutorials/scenario_management/6_scenario_comparison/src/scenario_comparison.py index 1b0b51236..76edeb2c1 100644 --- a/docs/tutorials/scenario_management/6_scenario_comparison/src/scenario_comparison.py +++ b/docs/tutorials/scenario_management/6_scenario_comparison/src/scenario_comparison.py @@ -1,7 +1,11 @@ -from taipy import Config -import taipy as tp -import pandas as pd import numpy as np +import pandas as pd + +import taipy as tp +import taipy.gui.builder as tgb +from taipy import Config +from taipy.gui import Gui + # Simulation function to predict sales based on pricing def predict_sales(price): @@ -19,26 +23,6 @@ def predict_sales(price): def calculate_revenue(price, sales_volume): return price * sales_volume -# Data Node configuration -price_input_cfg = Config.configure_data_node("price_input", default_data=100) -sales_output_cfg = Config.configure_data_node("sales_output") -revenue_output_cfg = Config.configure_data_node("revenue_output") - -# Task configurations -predict_sales_task_cfg = Config.configure_task( - id="predict_sales", - function=predict_sales, - input=price_input_cfg, - output=sales_output_cfg -) - -calculate_revenue_task_cfg = Config.configure_task( - id="calculate_revenue", - function=calculate_revenue, - input=[price_input_cfg, sales_output_cfg], - output=revenue_output_cfg -) - # Comparator function to compare revenue outputs def compare_revenue(*revenues): scenario_names = [f"Scenario {i}" for i in range(len(revenues))] @@ -46,15 +30,34 @@ def compare_revenue(*revenues): "Revenues": list(revenues)} return pd.DataFrame(comparisons) -# Scenario configuration -scenario_cfg = Config.configure_scenario( - id="pricing_strategy", - task_configs=[predict_sales_task_cfg, calculate_revenue_task_cfg], - comparators={revenue_output_cfg.id: compare_revenue} -) - - if __name__=="__main__": + # Data Node configuration + price_input_cfg = Config.configure_data_node("price_input", default_data=100) + sales_output_cfg = Config.configure_data_node("sales_output") + revenue_output_cfg = Config.configure_data_node("revenue_output") + + # Task configurations + predict_sales_task_cfg = Config.configure_task( + id="predict_sales", + function=predict_sales, + input=price_input_cfg, + output=sales_output_cfg + ) + + calculate_revenue_task_cfg = Config.configure_task( + id="calculate_revenue", + function=calculate_revenue, + input=[price_input_cfg, sales_output_cfg], + output=revenue_output_cfg + ) + + # Scenario configuration + scenario_cfg = Config.configure_scenario( + id="pricing_strategy", + task_configs=[predict_sales_task_cfg, calculate_revenue_task_cfg], + comparators={revenue_output_cfg.id: compare_revenue} + ) + core = tp.Core() core.run() @@ -67,22 +70,17 @@ def compare_revenue(*revenues): scenario_1.submit() scenario_2.submit() - + # Compare the scenarios comparisons = tp.compare_scenarios(scenario_1, scenario_2) print(comparisons) comparisons_revenue = comparisons["revenue_output"]['compare_revenue'] - from taipy.gui import Gui - import taipy.gui.builder as tgb - with tgb.Page() as compare_page: tgb.text("# Compare Scenarios", mode="md") tgb.chart("{comparisons_revenue}", type="bar", x="Scenarios", y="Revenues") tgb.table("{comparisons_revenue}") - Gui(compare_page).run(port=2442) - - + Gui(compare_page).run() diff --git a/docs/tutorials/scenario_management/7_scenario_subscription/index.md b/docs/tutorials/scenario_management/7_scenario_subscription/index.md index c105148a9..f445936bc 100644 --- a/docs/tutorials/scenario_management/7_scenario_subscription/index.md +++ b/docs/tutorials/scenario_management/7_scenario_subscription/index.md @@ -111,10 +111,10 @@ This visual element will be updated whenever there is a change in the submission # Entire code ```python +import taipy as tp from taipy.config import Config from taipy.core import Status -import taipy as tp -import time +from taipy.gui import Gui, notify # Normal function used by Taipy @@ -124,24 +124,20 @@ def double(nb): def add(nb): return nb + 10 +def on_submission_status_change(state=None, submittable=None, details=None): + submission_status = details.get('submission_status') -# Configuration of Data Nodes -input_cfg = Config.configure_data_node("my_input", default_data=21) -intermediate_cfg = Config.configure_data_node("intermediate") -output_cfg = Config.configure_data_node("my_output") - - -# Configuration of tasks -first_task_cfg = Config.configure_task("double", - double, - input_cfg, - intermediate_cfg) + if submission_status == 'COMPLETED': + print(f"{submittable.name} has completed.") + notify(state, 'success', 'Completed!') + # Add additional actions here, like updating the GUI or logging the completion. -second_task_cfg = Config.configure_task("add", - add, - intermediate_cfg, - output_cfg) + elif submission_status == 'FAILED': + print(f"{submittable.name} has failed.") + notify(state, 'error', 'Completed!') + # Handle failure, like sending notifications or logging the error. + # Add more conditions for other statuses as needed. def callback_scenario_state(scenario, job): """All the scenarios are subscribed to the callback_scenario_state function. It means whenever a job is done, it is called. @@ -151,47 +147,42 @@ def callback_scenario_state(scenario, job): scenario (Scenario): the scenario of the job changed job (_type_): the job that has its status changed """ - print(scenario.name) + print(f'{job.id} to {job.status}') + if job.status == Status.COMPLETED: for data_node in job.task.output.values(): - print(data_node.read()) - -# Configuration of scenario -scenario_cfg = Config.configure_scenario(id="my_scenario", - task_configs=[first_task_cfg, second_task_cfg], - name="my_scenario") - + print("Data node value:", data_node.read()) if __name__=="__main__": + # Configuration of Data Nodes + input_cfg = Config.configure_data_node("my_input", default_data=21) + intermediate_cfg = Config.configure_data_node("intermediate") + output_cfg = Config.configure_data_node("my_output") + + # Configuration of tasks + first_task_cfg = Config.configure_task("double", + double, + input_cfg, + intermediate_cfg) + + second_task_cfg = Config.configure_task("add", + add, + intermediate_cfg, + output_cfg) + + # Configuration of scenario + scenario_cfg = Config.configure_scenario(id="my_scenario", + task_configs=[first_task_cfg, second_task_cfg], + name="my_scenario") + tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg) scenario_1.subscribe(callback_scenario_state) scenario_1.submit(wait=True) - -from taipy.gui import Gui, notify - -def on_submission_status_change(state=None, submittable=None, details=None): - submission_status = details.get('submission_status') - - if submission_status == 'COMPLETED': - print(f"{submittable.name} has completed.") - notify(state, 'success', 'Completed!') - # Add additional actions here, like updating the GUI or logging the completion. - - elif submission_status == 'FAILED': - print(f"{submittable.name} has failed.") - notify(state, 'error', 'Completed!') - # Handle failure, like sending notifications or logging the error. - - # Add more conditions for other statuses as needed. - - -if __name__=="__main__": scenario_md = """ <|{scenario_1}|scenario|on_submission_change=on_submission_status_change|> -""" + """ Gui(scenario_md).run() - ``` diff --git a/docs/tutorials/scenario_management/7_scenario_subscription/src/scenario_subscription.py b/docs/tutorials/scenario_management/7_scenario_subscription/src/scenario_subscription.py index 017f8a9fa..336d6bf93 100644 --- a/docs/tutorials/scenario_management/7_scenario_subscription/src/scenario_subscription.py +++ b/docs/tutorials/scenario_management/7_scenario_subscription/src/scenario_subscription.py @@ -1,7 +1,7 @@ +import taipy as tp from taipy.config import Config from taipy.core import Status -import taipy as tp -import time +from taipy.gui import Gui, notify # Normal function used by Taipy @@ -11,24 +11,20 @@ def double(nb): def add(nb): return nb + 10 +def on_submission_status_change(state=None, submittable=None, details=None): + submission_status = details.get('submission_status') -# Configuration of Data Nodes -input_cfg = Config.configure_data_node("my_input", default_data=21) -intermediate_cfg = Config.configure_data_node("intermediate") -output_cfg = Config.configure_data_node("my_output") - - -# Configuration of tasks -first_task_cfg = Config.configure_task("double", - double, - input_cfg, - intermediate_cfg) + if submission_status == 'COMPLETED': + print(f"{submittable.name} has completed.") + notify(state, 'success', 'Completed!') + # Add additional actions here, like updating the GUI or logging the completion. -second_task_cfg = Config.configure_task("add", - add, - intermediate_cfg, - output_cfg) + elif submission_status == 'FAILED': + print(f"{submittable.name} has failed.") + notify(state, 'error', 'Completed!') + # Handle failure, like sending notifications or logging the error. + # Add more conditions for other statuses as needed. def callback_scenario_state(scenario, job): """All the scenarios are subscribed to the callback_scenario_state function. It means whenever a job is done, it is called. @@ -44,42 +40,35 @@ def callback_scenario_state(scenario, job): for data_node in job.task.output.values(): print("Data node value:", data_node.read()) -# Configuration of scenario -scenario_cfg = Config.configure_scenario(id="my_scenario", - task_configs=[first_task_cfg, second_task_cfg], - name="my_scenario") - - - if __name__=="__main__": + # Configuration of Data Nodes + input_cfg = Config.configure_data_node("my_input", default_data=21) + intermediate_cfg = Config.configure_data_node("intermediate") + output_cfg = Config.configure_data_node("my_output") + + # Configuration of tasks + first_task_cfg = Config.configure_task("double", + double, + input_cfg, + intermediate_cfg) + + second_task_cfg = Config.configure_task("add", + add, + intermediate_cfg, + output_cfg) + + # Configuration of scenario + scenario_cfg = Config.configure_scenario(id="my_scenario", + task_configs=[first_task_cfg, second_task_cfg], + name="my_scenario") + tp.Core().run() scenario_1 = tp.create_scenario(scenario_cfg) scenario_1.subscribe(callback_scenario_state) scenario_1.submit(wait=True) - -from taipy.gui import Gui, notify - -def on_submission_status_change(state=None, submittable=None, details=None): - submission_status = details.get('submission_status') - - if submission_status == 'COMPLETED': - print(f"{submittable.name} has completed.") - notify(state, 'success', 'Completed!') - # Add additional actions here, like updating the GUI or logging the completion. - - elif submission_status == 'FAILED': - print(f"{submittable.name} has failed.") - notify(state, 'error', 'Completed!') - # Handle failure, like sending notifications or logging the error. - - # Add more conditions for other statuses as needed. - - - -if __name__=="__main__": scenario_md = """ <|{scenario_1}|scenario|on_submission_change=on_submission_status_change|> -""" + """ Gui(scenario_md).run() diff --git a/docs/tutorials/visuals/1_the_on_change_callback/index.md b/docs/tutorials/visuals/1_the_on_change_callback/index.md index a09f8e75c..e52248843 100644 --- a/docs/tutorials/visuals/1_the_on_change_callback/index.md +++ b/docs/tutorials/visuals/1_the_on_change_callback/index.md @@ -54,22 +54,23 @@ from taipy.gui import Gui, Markdown def fahrenheit_to_celsius(fahrenheit): return (fahrenheit - 32) * 5 / 9 -fahrenheit = 100 -celsius = fahrenheit_to_celsius(fahrenheit) +def update_celsius(state): + state.celsius = fahrenheit_to_celsius(state.fahrenheit) + +if __name__=="__main__": + fahrenheit = 100 + celsius = fahrenheit_to_celsius(fahrenheit) -md = Markdown(""" + md = Markdown(""" # Local Callbacks ## Fahrenheit: <|{fahrenheit}|number|on_change=update_celsius|> ## Celsius: <|{celsius}|number|active=False|> -""") + """) -def update_celsius(state): - state.celsius = fahrenheit_to_celsius(state.fahrenheit) - -Gui(page=md).run() + Gui(page=md).run() ``` The relevant line here is line 12, where we defined a number control using the Taipy construct @@ -106,16 +107,24 @@ Take a look at the updated code: from taipy.gui import Gui, Markdown def fahrenheit_to_celsius(fahrenheit): - return (fahrenheit - 32) * 5 / 9 + return (fahrenheit - 32) * 5 / 9 def celsius_to_kelvin(celsius): - return celsius + 273.15 + return celsius + 273.15 -fahrenheit = 100 -celsius = fahrenheit_to_celsius(fahrenheit) -kelvin = celsius_to_kelvin(celsius) +def update_celsius(state): + state.celsius = fahrenheit_to_celsius(state.fahrenheit) + +def on_change(state, var_name, var_value): + if var_name == "celsius": + state.kelvin = celsius_to_kelvin(state.celsius) + +if __name__=="__main__": + fahrenheit = 100 + celsius = fahrenheit_to_celsius(fahrenheit) + kelvin = celsius_to_kelvin(celsius) -md = Markdown(""" + md = Markdown(""" # Local and Global Callbacks ## Fahrenheit: <|{fahrenheit}|number|on_change=update_celsius|> @@ -125,16 +134,9 @@ md = Markdown(""" ## Kelvin: <|{kelvin}|number|active=False|> -""") - -def update_celsius(state): - state.celsius = fahrenheit_to_celsius(state.fahrenheit) - -def on_change(state, var_name, var_value): - if var_name == "celsius": - state.kelvin = celsius_to_kelvin(state.celsius) + """) -Gui(page=md).run(dark_mode=False) + Gui(page=md).run(dark_mode=False) ``` On line 22, we added a new number control to our app, which is bound to the kelvin variable. The @@ -194,11 +196,12 @@ def fahrenheit_to_celsius(fahrenheit): def celsius_to_kelvin(celsius): return celsius + 273.15 -fahrenheit = 100 -celsius = fahrenheit_to_celsius(fahrenheit) -kelvin = celsius_to_kelvin(celsius) +if __name__=="__main__": + fahrenheit = 100 + celsius = fahrenheit_to_celsius(fahrenheit) + kelvin = celsius_to_kelvin(celsius) -md = Markdown(""" + md = Markdown(""" # Global Callbacks ## Fahrenheit: <|{fahrenheit}|number|> @@ -208,9 +211,9 @@ md = Markdown(""" ## Kelvin: <|{celsius_to_kelvin(fahrenheit_to_celsius(fahrenheit))}|number|active=False|> -""") + """) -Gui(page=md).run() + Gui(page=md).run() ``` Without using any callbacks, we instead simply interpolate the expression to be evaluated into diff --git a/docs/tutorials/visuals/2_using_tables/index.md b/docs/tutorials/visuals/2_using_tables/index.md index cbcac8e8a..d36b962a0 100644 --- a/docs/tutorials/visuals/2_using_tables/index.md +++ b/docs/tutorials/visuals/2_using_tables/index.md @@ -25,16 +25,17 @@ First, let's see how you make tables in Taipy: from taipy.gui import Gui, Markdown import pandas as pd -food_df = pd.DataFrame({ - "Meal": ["Lunch", "Dinner", "Lunch", "Lunch", "Breakfast", "Breakfast", "Lunch", "Dinner"], - "Category": ["Food", "Food", "Drink", "Food", "Food", "Drink", "Dessert", "Dessert"], - "Name": ["Burger", "Pizza", "Soda", "Salad", "Pasta", "Water", "Ice Cream", "Cake"], - "Calories": [300, 400, 150, 200, 500, 0, 400, 500], -}) +if __name__ == "__main__": + food_df = pd.DataFrame({ + "Meal": ["Lunch", "Dinner", "Lunch", "Lunch", "Breakfast", "Breakfast", "Lunch", "Dinner"], + "Category": ["Food", "Food", "Drink", "Food", "Food", "Drink", "Dessert", "Dessert"], + "Name": ["Burger", "Pizza", "Soda", "Salad", "Pasta", "Water", "Ice Cream", "Cake"], + "Calories": [300, 400, 150, 200, 500, 0, 400, 500], + }) -main_md = Markdown("<|{food_df}|table|>") + main_md = Markdown("<|{food_df}|table|>") -Gui(page=main_md).run() + Gui(page=main_md).run() ``` The table definition `<|{food_df}|table|>` (a syntax often used in Taipy) has these parts: @@ -273,14 +274,6 @@ from taipy.gui import Gui, Markdown, notify import pandas as pd -food_df = pd.DataFrame({ - "Meal": ["Lunch", "Dinner", "Lunch", "Lunch", "Breakfast", "Breakfast", "Lunch", "Dinner"], - "Category": ["Food", "Food", "Drink", "Food", "Food", "Drink", "Dessert", "Dessert"], - "Name": ["Burger", "Pizza", "Soda", "Salad", "Pasta", "Water", "Ice Cream", "Cake"], - "Calories": [300, 400, 150, 200, 500, 0, 400, 500], -}) - - def food_df_on_edit(state, var_name, payload): index = payload["index"] # row index col = payload["col"] # column name @@ -307,23 +300,29 @@ def food_df_on_add(state, var_name, payload): notify(state, "S", f"Added a new row.") - -table_properties = { - "class_name": "rows-bordered", - "filter": True, - "on_edit": food_df_on_edit, - "on_delete": food_df_on_delete, - "on_add": food_df_on_add, - "group_by[Category]": True, - "apply[Calories]": "sum", -} - - -main_md = Markdown(""" +if __name__ == "__main__": + food_df = pd.DataFrame({ + "Meal": ["Lunch", "Dinner", "Lunch", "Lunch", "Breakfast", "Breakfast", "Lunch", "Dinner"], + "Category": ["Food", "Food", "Drink", "Food", "Food", "Drink", "Dessert", "Dessert"], + "Name": ["Burger", "Pizza", "Soda", "Salad", "Pasta", "Water", "Ice Cream", "Cake"], + "Calories": [300, 400, 150, 200, 500, 0, 400, 500], + }) + + table_properties = { + "class_name": "rows-bordered", + "filter": True, + "on_edit": food_df_on_edit, + "on_delete": food_df_on_delete, + "on_add": food_df_on_add, + "group_by[Category]": True, + "apply[Calories]": "sum", + } + + main_md = Markdown(""" # Daily Calorie Tracker <|{food_df}|table|properties=table_properties|> -""") + """) -Gui(page=main_md).run() + Gui(page=main_md).run() ``` diff --git a/docs/tutorials/visuals/4_long_callbacks/src/long_callbacks.py b/docs/tutorials/visuals/4_long_callbacks/src/long_callbacks.py index 65b76febf..f059cb9ea 100644 --- a/docs/tutorials/visuals/4_long_callbacks/src/long_callbacks.py +++ b/docs/tutorials/visuals/4_long_callbacks/src/long_callbacks.py @@ -1,10 +1,4 @@ -from taipy.gui import Gui, Markdown, invoke_long_callback, notify, State - - -status = 0 -num_iterations = 20_000_000 -pi_list = [] -logs = "Not running" +from taipy.gui import Gui, Markdown, State, invoke_long_callback, notify def pi_approx(num_iterations: int): @@ -44,7 +38,7 @@ def heavy_status(state: State, status, pi_list: list): notify(state, "success", "Finished") state.pi_list = pi_list else: - notify(state, "error", f"An error was raised") + notify(state, "error", "An error was raised") else: state.status += 1 @@ -60,9 +54,13 @@ def on_action(state: State): state, pi_approx, [int(state.num_iterations)], heavy_status, [], 1000 ) +if __name__ == "__main__": + status = 0 + num_iterations = 20_000_000 + pi_list = [] + logs = "Not running" -page = Markdown( - """ + page = Markdown(""" # Approximating **Pi**{: .color-primary} using the Leibniz formula <|{num_iterations}|number|label=Number of iterations|> <|Approximate Pi|button|on_action=on_action|> @@ -72,15 +70,12 @@ def on_action(state: State): <|card| ## Logs ### <|{logs}|text|raw|> -|> -""" -) - - -layout = { - "xaxis": {"title": "Iteration (Percentage of Total Iterations)"}, - "yaxis": {"title": "Pi Approximation"}, -} +|> + """) + layout = { + "xaxis": {"title": "Iteration (Percentage of Total Iterations)"}, + "yaxis": {"title": "Pi Approximation"}, + } -Gui(page).run() + Gui(page).run() diff --git a/docs/tutorials/visuals/4_long_callbacks/src/trigger_update.py b/docs/tutorials/visuals/4_long_callbacks/src/trigger_update.py index 0b915b568..1afb17fdc 100644 --- a/docs/tutorials/visuals/4_long_callbacks/src/trigger_update.py +++ b/docs/tutorials/visuals/4_long_callbacks/src/trigger_update.py @@ -1,9 +1,8 @@ -from taipy.gui import Gui, invoke_long_callback, get_state_id, invoke_callback +import time + import taipy.gui.builder as tgb -import time +from taipy.gui import Gui, get_state_id, invoke_callback, invoke_long_callback -logs = "" -result = "No response yet" def status_fct(state, status, result): state.logs = "" @@ -20,20 +19,23 @@ def heavy_function(gui, state_id): invoke_callback(gui, state_id, user_status, ["Fact Checking"]) return "Here is the answer" - def respond(state): invoke_long_callback(state=state, user_function=heavy_function, user_function_args=[gui, get_state_id(state)], user_status_function=status_fct, user_status_function_args=[]) -with tgb.Page() as main_page: - tgb.button("Respond", on_action=respond) - with tgb.part("card"): - tgb.text("{logs}", mode="pre") - - tgb.text("# Result", mode="md") - tgb.text("{result}") +if __name__ == "__main__": + logs = "" + result = "No response yet" + + with tgb.Page() as main_page: + tgb.button("Respond", on_action=respond) + with tgb.part("card"): + tgb.text("{logs}", mode="pre") + + tgb.text("# Result", mode="md") + tgb.text("{result}") -gui = Gui(main_page) -gui.run() \ No newline at end of file + gui = Gui(main_page) + gui.run() diff --git a/docs/tutorials/visuals/7_multi_user/index.md b/docs/tutorials/visuals/7_multi_user/index.md index 121c14f35..f11cca6fb 100644 --- a/docs/tutorials/visuals/7_multi_user/index.md +++ b/docs/tutorials/visuals/7_multi_user/index.md @@ -6,7 +6,7 @@ short-description: Share variables between users and send messages between them. img: 7_multi_user/images/chat_screenshot.png --- -This tutorial will illustrate how to share variables between users and send messages +This tutorial will illustrate how to share variables between users and send messages between them using a simple two-user chat application. ![Chat Application](images/chat_screenshot.png){width=90% : .tp-image-border } @@ -14,29 +14,17 @@ between them using a simple two-user chat application. # Sharing variables -In Taipy, you can specify a variable as shared between users using -`gui.add_shared_variable("variable_name")`. This variable will become global and +In Taipy, you can specify a variable as shared between users using +`gui.add_shared_variable("variable_name")`. This variable will become global and can be changed and accessed by all users ignoring the user's state. -For example, the following code creates a two-user chat application. You can run +For example, the following code creates a two-user chat application. You can run this code in both a browser tab and an incognito window to simulate two users. ```python from taipy.gui import Gui, State import pandas as pd -timer_status = "Timer stopped" - -client_index = 1 -user_name = "" -conversation = pd.DataFrame( - {"User": ["Alex", "Doppler"], "Message": ["Hey!", "Whats'up?"]} -) -current_message = "" -new_message = "" -new_sender = "" -selected_row = [2] - def on_init(state: State): global client_index @@ -72,34 +60,47 @@ def on_change(state, var_name, value): ) state.selected_row = [len(state.conversation["User"]) + 1] +if __name__ == "__main__": + timer_status = "Timer stopped" -page = """# Multi-User **Chat**{: .color-primary} + client_index = 1 + user_name = "" + conversation = pd.DataFrame( + {"User": ["Alex", "Doppler"], "Message": ["Hey!", "Whats'up?"]} + ) + current_message = "" + new_message = "" + new_sender = "" + selected_row = [2] + + page = """ +# Multi-User **Chat**{: .color-primary} Username: <|{user_name}|input|active=false|> <|{conversation}|table|rebuild|show_all|class_name=table|selected={selected_row}|> <|{current_message}|input|label=Write your message here...|on_action=send_message|class_name=fullwidth|change_delay=-1|> -""" + """ -gui = Gui(page) -gui.add_shared_variable("conversation") -gui.run(dark_mode=True) + gui = Gui(page) + gui.add_shared_variable("conversation") + gui.run(dark_mode=True) ``` -Here, in the second to last line, we specify -`gui.add_shared_variable("conversation")` to share the `conversation` variable +Here, in the second to last line, we specify +`gui.add_shared_variable("conversation")` to share the `conversation` variable between users. This allows both users to see the same conversation. -Also note that when a new user connects, he has access to the previous messages +Also note that when a new user connects, he has access to the previous messages since conversation is a shared variable. ![Broadcasted Message Screenshot](images/shared_msg.png){width=90% : .tp-image-border } # Sending messages -Another approach to this application would be, instead of setting conversation as -a shared variable, to broadcast the new message to all current users. Here is how +Another approach to this application would be, instead of setting conversation as +a shared variable, to broadcast the new message to all current users. Here is how you can code it: ```python @@ -167,11 +168,11 @@ gui = Gui(page) gui.run(dark_mode=True) ``` -Here, in the `send_message` function, we broadcast the new message and the sender -to all users. The `on_change` function listens to the `new_message` variable and +Here, in the `send_message` function, we broadcast the new message and the sender +to all users. The `on_change` function listens to the `new_message` variable and updates the conversation accordingly. -Note that in this example, when a new user connects, he does not have access to the +Note that in this example, when a new user connects, he does not have access to the previous messages since conversation is not a shared variable. ![Broadcasted Message Screenshot](images/broadcasted_msg.png){width=90% : .tp-image-border } \ No newline at end of file From ec95e8c959ac0a7682fac806e3f1340f25b1fa10 Mon Sep 17 00:00:00 2001 From: trgiangdo Date: Wed, 24 Jul 2024 13:49:11 +0700 Subject: [PATCH 3/5] feat: clarify that export/import scenarios only available in enterprise --- docs/manuals/userman/sdm/scenario/index.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/manuals/userman/sdm/scenario/index.md b/docs/manuals/userman/sdm/scenario/index.md index 90dfbcfed..777af86c0 100644 --- a/docs/manuals/userman/sdm/scenario/index.md +++ b/docs/manuals/userman/sdm/scenario/index.md @@ -151,12 +151,12 @@ and other related information. ``` By default, Taipy executes the jobs asynchronously. If you want to wait until the submitted -jobs are finished, you can use the parameters _wait_ and _timeout_. +jobs are finished, you can use the parameters *wait* and *timeout*. -By default, the parameter _wait_ is False. If it is set to True, Taipy waits until all the -submitted jobs are finished. The parameter _timeout_ represents a time span in seconds. It -can be an integer or a float. If _wait_ is True and _timeout_ is not specified or None, there -is no limit to the wait time. If _wait_ is True and _timeout_ is specified, Taipy waits until +By default, the parameter *wait* is False. If it is set to True, Taipy waits until all the +submitted jobs are finished. The parameter *timeout* represents a time span in seconds. It +can be an integer or a float. If *wait* is True and *timeout* is not specified or None, there +is no limit to the wait time. If *wait* is True and *timeout* is specified, Taipy waits until all the submitted jobs are finished, or the timeout expires (which ever occurred first). !!! example @@ -420,6 +420,10 @@ if you add a tag that is not authorized, an exception will be raised. # Import/Export Scenarios +!!! warning "Available in Taipy Enterprise edition" + + This section is relevant only to the Enterprise edition of Taipy. + ## Export a scenario You can export a scenario with its related entities into an archive zip file using From 31c2a8ed91f0bd3cd659c2f69ea9eade300dac52 Mon Sep 17 00:00:00 2001 From: trgiangdo Date: Wed, 24 Jul 2024 16:15:48 +0700 Subject: [PATCH 4/5] feat: update example with imports outside of the if __name__==__main__ --- .../sdm/job/code-example/cancel-running.py | 7 +++--- .../userman/sdm/job/code-example/cancel.py | 7 +++--- .../code-example/index/submission-and-wait.py | 6 ++--- .../index/submission-from-scenario-class.py | 6 ++--- .../scenario/code-example/index/submission.py | 6 ++--- .../sdm/submission/code-example/get-delete.py | 6 ++--- .../code-example/hello-world/hello-world.py | 8 +++---- .../code-example/index/complete-example.py | 8 +++---- .../code-example/index/example-with-gui.py | 9 ++++---- .../submit-scenario-and-wait.py | 7 +++--- .../submit-scenario-before-run.py | 6 ++--- .../submit-scenario-other-syntax.py | 6 ++--- .../scenario-submission/submit-scenario.py | 6 ++--- .../submit-sequence-other-syntax.py | 6 ++--- .../scenario-submission/submit-sequence.py | 6 ++--- .../submit-task-other-syntax.py | 6 ++--- .../scenario-submission/submit-task.py | 6 ++--- .../scenario-submission/subscribe-example.py | 23 ++++++++++--------- ...hestration-vizelements-default-behavior.py | 9 ++++---- .../sales-forecasts-and-prod-orders.py | 8 +++---- .../scenario-comparison/comparison-example.py | 8 +++---- .../sales-forecasts-and-prod-orders.py | 8 +++---- 22 files changed, 83 insertions(+), 85 deletions(-) diff --git a/docs/manuals/userman/sdm/job/code-example/cancel-running.py b/docs/manuals/userman/sdm/job/code-example/cancel-running.py index 85fb6d9d4..f08d3bbed 100644 --- a/docs/manuals/userman/sdm/job/code-example/cancel-running.py +++ b/docs/manuals/userman/sdm/job/code-example/cancel-running.py @@ -1,15 +1,14 @@ from time import sleep +import taipy as tp +from taipy import Config + def double(nb): sleep(5) return nb * 2 - if __name__ == "__main__": - import taipy as tp - from taipy import Config - print(f'(1) Number of jobs: {len(tp.get_jobs())}.') # Create a scenario configuration with 2 sequential tasks. diff --git a/docs/manuals/userman/sdm/job/code-example/cancel.py b/docs/manuals/userman/sdm/job/code-example/cancel.py index ac5b58f93..10bcfee5f 100644 --- a/docs/manuals/userman/sdm/job/code-example/cancel.py +++ b/docs/manuals/userman/sdm/job/code-example/cancel.py @@ -1,13 +1,14 @@ from time import sleep +import taipy as tp +from taipy import Config + + def double(nb): sleep(5) return nb * 2 if __name__ == "__main__": - import taipy as tp - from taipy import Config - print(f'(1) Number of jobs: {len(tp.get_jobs())}.') # Create a scenario configuration with 2 sequential tasks. diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/submission-and-wait.py b/docs/manuals/userman/sdm/scenario/code-example/index/submission-and-wait.py index 2b363e447..b89aa7db9 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/submission-and-wait.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/submission-and-wait.py @@ -1,7 +1,7 @@ -if __name__ == '__main__': - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == '__main__': core = tp.Core() core.run() diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/submission-from-scenario-class.py b/docs/manuals/userman/sdm/scenario/code-example/index/submission-from-scenario-class.py index 91d3bca1c..8d121759a 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/submission-from-scenario-class.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/submission-from-scenario-class.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": core = tp.Core() core.run() diff --git a/docs/manuals/userman/sdm/scenario/code-example/index/submission.py b/docs/manuals/userman/sdm/scenario/code-example/index/submission.py index b6c5c7d57..b64be9a40 100644 --- a/docs/manuals/userman/sdm/scenario/code-example/index/submission.py +++ b/docs/manuals/userman/sdm/scenario/code-example/index/submission.py @@ -1,7 +1,7 @@ -if __name__ == '__main__': - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == '__main__': core = tp.Core() core.run() diff --git a/docs/manuals/userman/sdm/submission/code-example/get-delete.py b/docs/manuals/userman/sdm/submission/code-example/get-delete.py index ef669a2c6..c9b7c11f8 100644 --- a/docs/manuals/userman/sdm/submission/code-example/get-delete.py +++ b/docs/manuals/userman/sdm/submission/code-example/get-delete.py @@ -1,11 +1,11 @@ +import taipy as tp +from taipy import Config + def double(nb): return nb * 2 if __name__ == "__main__": - import taipy as tp - from taipy import Config - # Create a scenario configuration made of one task configuration input_cfg = Config.configure_data_node("my_input", default_data=21) output_cfg = Config.configure_data_node("my_output") diff --git a/docs/manuals/userman/task-orchestration/code-example/hello-world/hello-world.py b/docs/manuals/userman/task-orchestration/code-example/hello-world/hello-world.py index f2646770d..37f4ab20e 100644 --- a/docs/manuals/userman/task-orchestration/code-example/hello-world/hello-world.py +++ b/docs/manuals/userman/task-orchestration/code-example/hello-world/hello-world.py @@ -1,11 +1,11 @@ +import taipy as tp +from taipy import Config, Core + + def build_message(name: str): return f"Hello {name}!" - if __name__ == "__main__": - import taipy as tp - from taipy import Config, Core - name_data_node_cfg = Config.configure_data_node(id="input_name") message_data_node_cfg = Config.configure_data_node(id="message") build_msg_task_cfg = Config.configure_task("build_msg", build_message, name_data_node_cfg, message_data_node_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/index/complete-example.py b/docs/manuals/userman/task-orchestration/code-example/index/complete-example.py index e94061424..c9cec6132 100644 --- a/docs/manuals/userman/task-orchestration/code-example/index/complete-example.py +++ b/docs/manuals/userman/task-orchestration/code-example/index/complete-example.py @@ -1,11 +1,11 @@ +import taipy as tp +from taipy import Config + + def do_nothing(value): print(f"do_nothing but printing the value: {value}") - if __name__ == "__main__": - import taipy as tp - from taipy import Config - # Configure a scenario value_cfg = Config.configure_data_node("my_value", default_data=42) task_cfg = Config.configure_task("my_task", do_nothing, input=[value_cfg]) diff --git a/docs/manuals/userman/task-orchestration/code-example/index/example-with-gui.py b/docs/manuals/userman/task-orchestration/code-example/index/example-with-gui.py index 2c0b7d473..a7a7096ef 100644 --- a/docs/manuals/userman/task-orchestration/code-example/index/example-with-gui.py +++ b/docs/manuals/userman/task-orchestration/code-example/index/example-with-gui.py @@ -1,15 +1,14 @@ -# Creating a scenario variable and a job variable to be bound to the visual elements -scenario = None -job = None +from taipy import Config, Core, Gui # Implementing a function to be used as a Taipy task in a scenario def identity(*values): return values - if __name__ == "__main__": - from taipy import Config, Core, Gui + # Creating a scenario variable and a job variable to be bound to the visual elements + scenario = None + job = None # Configure a scenario in_cfg = Config.configure_data_node(id="inpt", default_data="IN") diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-and-wait.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-and-wait.py index 2227acd4c..48b1d127c 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-and-wait.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-and-wait.py @@ -1,7 +1,8 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config + +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-before-run.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-before-run.py index 5a215d8b9..ee0c0aec5 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-before-run.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-before-run.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": core = tp.Core() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-other-syntax.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-other-syntax.py index 9a90f50fc..190a2868c 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-other-syntax.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario-other-syntax.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario.py index 986e71a64..6e6f1fb2d 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-scenario.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence-other-syntax.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence-other-syntax.py index 8cfda15d4..5d792ca6f 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence-other-syntax.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence-other-syntax.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence.py index e9be51b94..469bb2c35 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-sequence.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task-other-syntax.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task-other-syntax.py index 2216b8cb1..71f0fcd8b 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task-other-syntax.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task-other-syntax.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task.py index e17cd1039..bfb52429b 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/submit-task.py @@ -1,7 +1,7 @@ -if __name__ == "__main__": - import taipy as tp - import my_config +import taipy as tp +import my_config +if __name__ == "__main__": tp.Core().run() scenario = tp.create_scenario(my_config.monthly_scenario_cfg) diff --git a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/subscribe-example.py b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/subscribe-example.py index d293c5bb4..8223f6e40 100644 --- a/docs/manuals/userman/task-orchestration/code-example/scenario-submission/subscribe-example.py +++ b/docs/manuals/userman/task-orchestration/code-example/scenario-submission/subscribe-example.py @@ -1,19 +1,20 @@ -if __name__ == "__main__": - import taipy as tp - from taipy import Config +import taipy as tp +from taipy import Config + - def do_nothing(): - ... +def do_nothing(): + ... - def my_global_subscriber(scenario, job): - print(f" my_global_subscriber: scenario '{scenario.config_id}'; task '{job.task.config_id}'.") +def my_global_subscriber(scenario, job): + print(f" my_global_subscriber: scenario '{scenario.config_id}'; task '{job.task.config_id}'.") - def my_subscriber(scenario, job): - print(f" my_subscriber: scenario '{scenario.config_id}'; task '{job.task.config_id}'.") +def my_subscriber(scenario, job): + print(f" my_subscriber: scenario '{scenario.config_id}'; task '{job.task.config_id}'.") - def my_subscriber_multi_param(scenario, job, params): - print(f" my_subscriber_multi_param: params {params}; task '{job.task.config_id}'.") +def my_subscriber_multi_param(scenario, job, params): + print(f" my_subscriber_multi_param: params {params}; task '{job.task.config_id}'.") +if __name__ == "__main__": task_1 = Config.configure_task("my_task_1", do_nothing) task_2 = Config.configure_task("my_task_2", do_nothing) scenario_1 = Config.configure_scenario("my_scenario", [task_1, task_2]) diff --git a/docs/manuals/userman/task-orchestration/code-example/vizelemts/task-orchestration-vizelements-default-behavior.py b/docs/manuals/userman/task-orchestration/code-example/vizelemts/task-orchestration-vizelements-default-behavior.py index 59ab04799..30ef309f2 100644 --- a/docs/manuals/userman/task-orchestration/code-example/vizelemts/task-orchestration-vizelements-default-behavior.py +++ b/docs/manuals/userman/task-orchestration/code-example/vizelemts/task-orchestration-vizelements-default-behavior.py @@ -1,16 +1,15 @@ from taipy import Config, Core, Gui -# Creating a scenario variable and a job variable to be bound to the visual elements -scenario = None -job = None - # Implementing a function to be used as a Taipy task in a scenario def identity(*values): return values - if __name__ == "__main__": + # Creating a scenario variable and a job variable to be bound to the visual elements + scenario = None + job = None + # Configuring a scenario in_cfg = Config.configure_data_node(id="inpt", default_data="IN") out_cfg = Config.configure_data_node(id="outpt") diff --git a/docs/manuals/userman/what-if-analysis/code-example/multiple-scenarios/sales-forecasts-and-prod-orders.py b/docs/manuals/userman/what-if-analysis/code-example/multiple-scenarios/sales-forecasts-and-prod-orders.py index 421eb9d76..bc479ca4f 100644 --- a/docs/manuals/userman/what-if-analysis/code-example/multiple-scenarios/sales-forecasts-and-prod-orders.py +++ b/docs/manuals/userman/what-if-analysis/code-example/multiple-scenarios/sales-forecasts-and-prod-orders.py @@ -1,8 +1,8 @@ -if __name__ == "__main__": - from taipy import Config - import taipy as tp - from datetime import datetime +from datetime import datetime +import taipy as tp +from taipy import Config +if __name__ == "__main__": # Configure data nodes with different scopes hist_cfg = Config.configure_csv_data_node("sales_history") model_cfg = Config.configure_data_node("trained_model") diff --git a/docs/manuals/userman/what-if-analysis/code-example/scenario-comparison/comparison-example.py b/docs/manuals/userman/what-if-analysis/code-example/scenario-comparison/comparison-example.py index 165bfa030..0ccfaeb94 100644 --- a/docs/manuals/userman/what-if-analysis/code-example/scenario-comparison/comparison-example.py +++ b/docs/manuals/userman/what-if-analysis/code-example/scenario-comparison/comparison-example.py @@ -1,6 +1,8 @@ import pandas as pd -from taipy import Config import taipy as tp +import taipy.gui.builder as tgb +from taipy import Config +from taipy.gui import Gui def compare_revenue(*sales_predictions): @@ -10,7 +12,6 @@ def compare_revenue(*sales_predictions): "Revenues": [sales * unit_price for sales in sales_predictions]} return pd.DataFrame(revenues) - if __name__ == "__main__": # Configure scenario weather_cfg = Config.configure_data_node("weather") @@ -39,9 +40,6 @@ def compare_revenue(*sales_predictions): revenues = tp.compare_scenarios(sunny, cloudy, rainy)[sales_cfg.id]["compare_revenue"] # Create a user interface - from taipy.gui import Gui - import taipy.gui.builder as tgb - with tgb.Page() as compare_page: tgb.chart("{revenues}", type="bar", x="Scenarios", y="Revenues") tgb.table("{revenues}") diff --git a/docs/manuals/userman/what-if-analysis/code-example/scenarios-and-cycles/sales-forecasts-and-prod-orders.py b/docs/manuals/userman/what-if-analysis/code-example/scenarios-and-cycles/sales-forecasts-and-prod-orders.py index e53a3bccc..fb8d65269 100644 --- a/docs/manuals/userman/what-if-analysis/code-example/scenarios-and-cycles/sales-forecasts-and-prod-orders.py +++ b/docs/manuals/userman/what-if-analysis/code-example/scenarios-and-cycles/sales-forecasts-and-prod-orders.py @@ -1,8 +1,8 @@ -if __name__ == "__main__": - from taipy import Config, Frequency, Scope - import taipy as tp - from datetime import datetime +from datetime import datetime +import taipy as tp +from taipy import Config, Frequency, Scope +if __name__ == "__main__": # Configure data nodes with different scopes hist_cfg = Config.configure_csv_data_node("sales_history", scope=Scope.GLOBAL) model_cfg = Config.configure_data_node("trained_model", scope=Scope.CYCLE) From 5fb68be515206a2dcf7722279f277c5eb1551b33 Mon Sep 17 00:00:00 2001 From: trgiangdo Date: Wed, 24 Jul 2024 16:28:23 +0700 Subject: [PATCH 5/5] feat: clarify the unexpected behavior in standalone mode regardings the main script --- docs/manuals/userman/configuration/job-config.md | 10 ++++++++-- .../scenario_management/5_job_execution/index.md | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/manuals/userman/configuration/job-config.md b/docs/manuals/userman/configuration/job-config.md index e178c74ad..64d2d1eb4 100644 --- a/docs/manuals/userman/configuration/job-config.md +++ b/docs/manuals/userman/configuration/job-config.md @@ -88,8 +88,14 @@ integer value greater than 1. That starts each `Job^` in a dedicated process wit The default value of *max_nb_of_workers* is 2. !!! warning - In *standalone* mode, it's a good practice to protect the main code with the `if __name__ == "__main":` - condition. By doing this, the code will not be re-executed when the subprocesses are spawned. + + In *standalone* mode, when a subprocess is spawned, the code is re-executed except + for the code inside the `if __name__ == "__main__":` condition. This can lead to + unexpected behavior if the code is not protected. + + Therefore, it's a good practice to protect the main code with the `if __name__ == "__main":` + condition in your Taipy application main script. By doing this, the code will not be re-executed + when the subprocesses are spawned. For example, the following configuration will allow Taipy to run up to eight `Job^`s simultaneously: diff --git a/docs/tutorials/scenario_management/5_job_execution/index.md b/docs/tutorials/scenario_management/5_job_execution/index.md index 28d07d857..2ca771090 100644 --- a/docs/tutorials/scenario_management/5_job_execution/index.md +++ b/docs/tutorials/scenario_management/5_job_execution/index.md @@ -38,8 +38,14 @@ This line of code alters the execution mode. Setting it to *standalone* makes Ta In this configuration, a maximum of two tasks can run simultaneously. !!! warning - In *standalone* mode, it's a good practice to protect the main code with the `if __name__ == "__main":` - condition. By doing this, the code will not be re-executed when the subprocesses are spawned. + + In *standalone* mode, when a subprocess is spawned, the code is re-executed except + for the code inside the `if __name__ == "__main__":` condition. This can lead to + unexpected behavior if the code is not protected. + + Therefore, it's a good practice to protect the main code with the `if __name__ == "__main":` + condition in your Taipy application main script. By doing this, the code will not be re-executed + when the subprocesses are spawned. ```python Config.configure_job_executions(mode="standalone", max_nb_of_workers=2)