/
Infectedsword64
/
Smart_house_model
Обзор
Документация
Войти
/
Infectedsword64
/
Smart_house_model
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
interface.py
160 строк
7 KB
Infectedsword64
Create: __init__.py, API_client.py, collect_data.py, interface.py
23 июл 2026, 20:09
Верифицирован
23 июл 2026, 20:09
f21150b
Код
Авторство
О чём код?
import tkinter as tk from tkinter import ttk import os class SmartHomeApp: def __init__(self, root, APIClient=None): self.root = root self.root.title("Умный дом - модель") self.root.geometry("400x300") self.root.resizable(False, False) # API-клиент для отправки команд (может быть None, если не требуется управление) self.APIClient = APIClient # Переменные для отображения данных self.light_status = tk.StringVar(value="Выключено") self.temperature = tk.StringVar(value="- °C") self.humidity = tk.StringVar(value="- %") self.setup_ui() # Запускаем первое обновление данных и планируем периодическое self.update_data() self.schedule_update() def setup_ui(self): main_frame = ttk.Frame(self.root, padding="20") main_frame.pack(fill=tk.BOTH, expand=True) title_label = ttk.Label( main_frame, text="Система умного дома", font=("Arial", 16, "bold"), foreground="darkblue" ) title_label.pack(pady=(0, 20), anchor="center") data_frame = ttk.Frame(main_frame) data_frame.pack(fill=tk.X, pady=10) # Освещение light_label = ttk.Label(data_frame, text="Освещение:", font=("Arial", 10, "bold")) light_label.grid(row=0, column=0, sticky=tk.W, pady=5) self.light_value_label = ttk.Label( data_frame, textvariable=self.light_status, font=("Arial", 10), foreground="red" ) self.light_value_label.grid(row=0, column=1, sticky=tk.W, padx=(10, 0), pady=5) # Температура temp_label = ttk.Label(data_frame, text="Температура:", font=("Arial", 10, "bold")) temp_label.grid(row=1, column=0, sticky=tk.W, pady=5) self.temp_value_label = ttk.Label( data_frame, textvariable=self.temperature, font=("Arial", 10) ) self.temp_value_label.grid(row=1, column=1, sticky=tk.W, padx=(10, 0), pady=5) # Влажность humidity_label = ttk.Label(data_frame, text="Влажность:", font=("Arial", 10, "bold")) humidity_label.grid(row=2, column=0, sticky=tk.W, pady=5) self.humidity_value_label = ttk.Label( data_frame, textvariable=self.humidity, font=("Arial", 10) ) self.humidity_value_label.grid(row=2, column=1, sticky=tk.W, padx=(10, 0), pady=5) # Кнопки управления button_frame = ttk.Frame(main_frame) button_frame.pack(fill=tk.X, pady=20) on_button = ttk.Button( button_frame, text="Включить освещение", command=self.turn_on_light, style="Success.TButton" ) on_button.pack(side=tk.LEFT, padx=(0, 10)) off_button = ttk.Button( button_frame, text="Выключить освещение", command=self.turn_off_light, style="Danger.TButton" ) off_button.pack(side=tk.LEFT) def update_data(self): """Читает последнюю строку из data.txt и обновляет интерфейс.""" filename = "data.txt" try: if not os.path.exists(filename): return with open(filename, "r", encoding="utf-8") as f: lines = f.readlines() if not lines: return last_line = lines[-1].strip() if not last_line: return # Формат строки: "2026-05-07 15:14:23.450213 temp:120 hum:30 light:1" parts = last_line.split() # Пропускаем первые два элемента (дата и время) и ищем нужные метки temp_val = hum_val = light_val = None for part in parts[2:]: # начинаем с индекса 2, т.к. [0] - дата, [1] - время if part.startswith("temp:"): temp_val = part.split(":")[1] elif part.startswith("hum:"): hum_val = part.split(":")[1] elif part.startswith("light:"): light_val = part.split(":")[1] # Обновляем переменные интерфейса if temp_val is not None: self.temperature.set(f"{temp_val} °C") if hum_val is not None: self.humidity.set(f"{hum_val} %") if light_val is not None: if light_val == "1": self.light_status.set("Включено") self.light_value_label.config(foreground="green") else: self.light_status.set("Выключено") self.light_value_label.config(foreground="red") except Exception as e: # В случае ошибки можно вывести в консоль, но не нарушать работу программы print(f"Ошибка при чтении data.txt: {e}") def schedule_update(self): """Планирует следующее обновление данных через 5 секунд.""" self.root.after(5000, self.update_data) self.root.after(5000, self.schedule_update) # рекурсивный вызов для постоянного обновления def turn_on_light(self): """Обработчик кнопки «Включить освещение».""" if self.APIClient: try: self.APIClient.setData("LightState", 1) print("Команда: Включить освещение") except Exception as e: print(f"Не удалось отправить команду: {e}") else: print("API-клиент не доступен") def turn_off_light(self): """Обработчик кнопки «Выключить освещение».""" if self.APIClient: try: self.APIClient.setData("LightState", 0) print("Команда: Выключить освещение") except Exception as e: print(f"Не удалось отправить команду: {e}") else: print("API-клиент не доступен")