Examples Source section: `https://appsudo.com/doc#examples` Example set in the docs - Todo List App - Weather App - Tetris Game Todo List App - Demonstrates `DataStore`, `RepeatView`, `find_element_by_id(...)`, and form handlers. Python excerpt: ```python class TodoListApp(App): def __init__(self, application_path): App.__init__(self, "TodoList", application_path) self.inflater = ViewInflater(self) self.ui_view = None self.tasks = [] self.data = TodoListData(application_path) self.setup() def setup(self): DataStore.get("todo_tasks", self.load_tasks) def on_create_task_view(self, parent): return self.inflater.inflate("todo_item", None) def on_bind_task_view(self, view, task): checkbox = view.find_element_by_id("task_checkbox") checkbox.set_text(task.text) checkbox.set_checked(task.completed) ``` ASXML excerpt: ```xml ``` Weather App - Demonstrates `HttpClient`, `DataLoader`, `DataStore`, and live UI updates. Python excerpt: ```python from runtime.DataLoader import DataLoader config = DataLoader.load_json(application_path, "config") self.api_key = config.get("weather_api_key", "YOUR_API_KEY_HERE") url = f"https://api.openweathermap.org/data/2.5/weather?q={self.data.city}&units=metric&appid={self.api_key}" HttpClient.current().get(url, {}, self.process_weather_response) ``` Config file: ```json { "weather_api_key": "YOUR_OPENWEATHERMAP_API_KEY" } ``` Tetris Game - Demonstrates `Canvas`, `GameWindow`, and pygame integration. Python excerpt: ```python class TetrisApp(App): def __init__(self, application_path): super().__init__("TetrisGameApp", application_path) self.application_path = application_path self.ui_view = None self.game_instance = None self.setup() def setup(self): self.ui_view = Canvas() self.game_instance = TetrisGamePyGame(self.application_path, self.ui_view) def run(self): super().run() if self.ui_view: self.render(self.ui_view.render()) ``` Code Snippets From Docs - The blocks below were extracted from the corresponding section of `appsudo.com/doc`. Snippet 1 ``` from appsudo import App, AppRuntime from components.view import ViewInflater from components.form import Button, TextBox from runtime.Helper import Helper from runtime.DataStore import DataStore class TodoItem: def __init__(self, text, completed=False): self.text = text self.completed = completed class TodoListData: def __init__(self, application_path): self.application_path = application_path self.new_task = "" self.task_placeholder = "Enter a new task..." self.add_button_text = "Add Task" self.title = "My Todo List" self.list = [] # For storing the tasks class TodoListApp(App): def __init__(self, application_path): App.__init__(self, "TodoList", application_path) self.inflater = ViewInflater(self) self.ui_view = None self.tasks = [] self.data = TodoListData(application_path) self.setup() def setup(self): # Load saved tasks from DataStore DataStore.get("todo_tasks", self.load_tasks) def load_tasks(self, saved_tasks): if saved_tasks: try: import json task_data = json.loads(saved_tasks) for item in task_data: self.tasks.append(TodoItem(item["text"], item["completed"])) except Exception as e: Helper.log(f"Error loading tasks: {e}") # Create UI self.ui_view = self.inflater.inflate("todo_list", self.data) self.refresh_task_list() def save_tasks(self): # Save tasks to DataStore try: import json task_data = [] for task in self.tasks: task_data.append({ "text": task.text, "completed": task.completed }) DataStore.set("todo_tasks", json.dumps(task_data), lambda r: None) except Exception as e: Helper.log(f"Error saving tasks: {e}") def on_task_input_change(self, element): self.data.new_task = element.get_text() def on_add_task(self, element): if self.data.new_task.strip(): # Add new task self.tasks.append(TodoItem(self.data.new_task)) # Clear input input_box = self.ui_view.find_element_by_id("task_input") input_box.set_text("") self.data.new_task = "" # Refresh list and save self.refresh_task_list() self.save_tasks() def on_create_task_view(self, parent): # Create a view for each task return self.inflater.inflate("todo_item", None) def on_bind_task_view(self, view, task): # Update task item view with data checkbox = view.find_element_by_id("task_checkbox") checkbox.set_text(task.text) checkbox.set_checked(task.completed) # Set delete button handler delete_btn = view.find_element_by_id("delete_button") delete_btn.set_tag(self.tasks.index(task)) # Store task index in button tag # Set checkbox change handler checkbox.set_tag(self.tasks.index(task)) # Store task index in checkbox tag def on_task_status_change(self, element, checked): # Update task completion status task_index = element.get_tag() if 0 <= task_index < len(self.tasks): self.tasks[task_index].completed = checked self.save_tasks() def on_delete_task(self, element): # Delete task task_index = element.get_tag() if 0 <= task_index < len(self.tasks): del self.tasks[task_index] self.refresh_task_list() self.save_tasks() def refresh_task_list(self): # Update task list view task_list_scroll_view = self.ui_view.find_element_by_id("task_list") if task_list_scroll_view: repeat_view_container = task_list_scroll_view.get_child_at(0) # Assuming RepeatView is the direct child if repeat_view_container: # This might be the RepeatView itself or a wrapper # If RepeatView is not the direct child, find it tasks_repeat_view = repeat_view_container.find_element_by_id("tasks_repeat_view") or repeat_view_container if tasks_repeat_view and hasattr(tasks_repeat_view, 'clear'): tasks_repeat_view.clear() # Clear items from RepeatView if it has clear method elif tasks_repeat_view and hasattr(tasks_repeat_view, 'set_items'): # Or reset items tasks_repeat_view.set_items([]) # Update data self.data.list = self.tasks # Rebind data to RepeatView repeat_view = self.ui_view.find_element_by_id("tasks_repeat_view") if repeat_view: repeat_view.set_items(self.tasks) def run(self): App.run(self) self.render(self.ui_view.render()) ``` Snippet 2 ```