Загрузка данных
import flet as ft
def main(page: ft.Page):
page.title = "Путь к спокойствию"
page.theme_mode = ft.ThemeMode.LIGHT
page.bgcolor = "#F0F4F8" # Мягкий светло-серый фон
page.scroll = ft.ScrollMode.AUTO
# База данных текстов для каждого раздела
TOPIC_TEXTS = {
"Буллинг": "Если вас булят, помните: дело не в вас. Не молчите, обязательно поделитесь с тем, кому доверяете (родители, школьный психолог, близкий друг). Записывайте факты агрессии и не пытайтесь отвечать агрессией на агрессию.",
"Комплексы / низкая самооценка": "Комплексы часто навязаны извне. Попробуйте сфокусироваться на своих сильных сторонах и вещах, которые у вас хорошо получаются. Перестаньте сравнивать чужую «витрину» со своей «изнанкой».",
"Боязнь будущего": "Бояться неизвестности — это нормально. Разбейте большую цель (кем быть по жизни) на маленькие шаги. Пробуйте разные сферы уже сейчас, ведь выбор профессии сегодня — это не выбор на всю жизнь.",
"Одиночество": "Чувство одиночества бывает у каждого. Это временное состояние. Попробуйте найти единомышленников через ваши интересы или хобби в тематических сообществах или кружках.",
"Никто не поддерживает": "Если близкие вас не слышат, это ранит. Но помните, что вы можете найти опору внутри себя. Иногда людям нужно время, чтобы понять вас. Попробуйте поговорить с ними без взаимных упреков через 'Я-сообщения'.",
"Тревога": "Тревога — это сигнал организма. Когда она накатывает, вернитесь в реальность через тело: сделайте глубокий вдох и долгий выдох (дыхание по квадрату), найдите глазами 5 синих предметов вокруг себя.",
"Первая (неудачная) любовь": "Разрыв первых отношений переживается очень остро. Дайте себе время погоревать и выплакаться, это нормальная часть процесса. Со временем эта боль утихнет и превратится в ценный опыт.",
"Как найти себе хобби": "Чтобы найти то, что интересует, нужно просто пробовать. Составьте список из 5 вещей, которые вы никогда не делали (рисование, кодинг, скейтборд), и уделите каждой хотя бы по одному часу.",
"Проблемы с учителями": "В конфликте с учителем старайтесь отделять эмоции от учебы. Говорите вежливо, спокойно аргументируйте свою позицию. Если ситуация зашла в тупик, обратитесь за помощью к классному руководителю или родителям.",
"Ссоры с родителями": "Родители часто ругаются из-за страха за вас или банальной усталости. Попробуйте начать разговор первыми в спокойной обстановке: 'Мне тяжело, когда мы ссоримся, давай обсудим это'."
}
# Функция для открытия экрана с текстом рекомендации
def open_topic(e):
topic_name = e.control.data
topic_text = TOPIC_TEXTS.get(topic_name, "Рекомендации скоро появятся...")
# Очищаем страницу и собираем экран статьи
page.controls.clear()
page.add(
ft.Container(
content=ft.Column([
ft.Text(topic_name, size=24, weight=ft.FontWeight.BOLD, color="#1A365D"),
ft.Container(height=10),
ft.Text(topic_text, size=16, color="#2D3748"),
ft.Container(height=30),
ft.ElevatedButton(
text="Назад к темам",
icon=ft.icons.ARROW_BACK,
on_click=show_main_menu,
style=ft.ButtonStyle(
bgcolor="#2B6CB0",
color=ft.colors.WHITE
)
)
]),
padding=20,
margin=ft.Margin(top=20, left=15, right=15, bottom=20) # Исправлено под Flet 1.0+
)
)
page.update()
# Функция возврата на главный экран (меню)
def show_main_menu(e=None):
page.controls.clear()
# Шапка
header = ft.Container(
content=ft.Column([
ft.Text("Путь к спокойствию", size=28, weight=ft.FontWeight.BOLD, color="#1A365D", text_align=ft.TextAlign.CENTER),
ft.Text("Проект, посвященный психологическому благополучию подростка. Здесь собраны рекомендации, которые помогут справиться со стрессом, тревогой и одиночеством.",
size=14, color="#4A5568", text_align=ft.TextAlign.CENTER),
ft.Text("Выберите тему, про которую хотите узнать:", size=16, weight=ft.FontWeight.W_500, color="#2B6CB0"),
], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.CENTER),
padding=20,
alignment=ft.alignment.center
)
# Сетка кнопок-карточек
grid = ft.Column(spacing=12)
for topic in TOPIC_TEXTS.keys():
card = ft.Container(
content=ft.Row([
ft.Icon(ft.icons.LIGHTBULB_OUTLINED, color="#2B6CB0"),
ft.VerticalDivider(width=10, color=ft.colors.TRANSPARENT),
ft.Expanded(child=ft.Text(topic, size=16, weight=ft.FontWeight.W_500, color="#2D3748"))
], alignment=ft.MainAxisAlignment.START),
padding=15,
bgcolor=ft.colors.WHITE,
border_radius=10,
on_click=open_topic,
data=topic, # Передаем имя темы в обработчик клика
shadow=ft.BoxShadow(blur_radius=4, color="#10000000")
)
grid.controls.append(card)
# Нижняя часть (Слоган и кнопка отзыва)
footer = ft.Container(
content=ft.Column([
ft.Text("Путь к спокойствию начинается с понимания себя.", size=14, italic=True, color="#718096"),
ft.Container(height=10),
ft.OutlinedButton(
text="Оставить отзыв",
icon=ft.icons.FEEDBACK,
style=ft.ButtonStyle(color="#2B6CB0")
)
], horizontal_alignment=ft.CrossAxisAlignment.CENTER),
padding=30,
alignment=ft.alignment.center
)
# Собираем всё на главный экран
page.add(
ft.Container(
content=ft.Column([header, grid, footer]),
max_width=600, # Чтобы красиво смотрелось и на ПК, ограничиваем ширину по центру
alignment=ft.alignment.top_center,
margin=ft.Margin(left=15, right=15, top=0, bottom=0) # Исправлено под Flet 1.0+
)
)
page.update()
# Запускаем начальный экран
show_main_menu()
ft.app(target=main)