Найти в Дзене
Программы от меня

Создаём интерфейс машины времени из фильма «Гостья из будущего» на Python и Kivy

Кто из нас в детстве не засматривался на приборы в рубке звездолёта «Пегас» или на мигающий огнями пульт Коли Герасимова, пытающегося освоить машину времени? Атмосфера советской кинофантастики 80-х уникальна: зелёные мониторы, выпуклые кнопки и загадочные цифровые ряды. Но что, если я скажу вам, что воссоздать легендарный интерфейс машины времени можно прямо сейчас на вашем ноутбуке? И не на C++, а на чистом Python с помощью библиотеки Kivy. Сегодня мы не просто напишем код. Мы прикоснёмся к легенде и создадим рабочий прототип хронокапсулы, которым можно будет управлять. Для нашей задачи идеально подходит фреймворк Kivy . Почему? Поехали! Прежде чем писать код, давайте вспомним, как выглядела типичная приборная панель в советской фантастике: Мы создадим главное окно с текущим временем (как точкой отсчёта), полем ввода целевой даты и зелёной кнопкой «Пуск». Создадим файл main.py. Это будет сердце нашей машины времени. python from kivy.app import App
from kivy.uix.boxlayout import Bo
Оглавление


Привет, программисты и ностальгирующие фантасты!

Кто из нас в детстве не засматривался на приборы в рубке звездолёта «Пегас» или на мигающий огнями пульт Коли Герасимова, пытающегося освоить машину времени? Атмосфера советской кинофантастики 80-х уникальна: зелёные мониторы, выпуклые кнопки и загадочные цифровые ряды. Но что, если я скажу вам, что воссоздать легендарный интерфейс машины времени можно прямо сейчас на вашем ноутбуке? И не на C++, а на чистом Python с помощью библиотеки Kivy.

Сегодня мы не просто напишем код. Мы прикоснёмся к легенде и создадим рабочий прототип хронокапсулы, которым можно будет управлять.

-2

Почему Kivy?

Для нашей задачи идеально подходит фреймворк Kivy . Почему?

  1. Кроссплатформенность: Интерфейс будет одинаково круто выглядеть и на Windows, и на macOS, и даже на Android (представьте миелофон в смартфоне!).
  2. Гибкость графики: Kivy позволяет легко рисовать произвольные фигуры, анимировать их и накладывать эффекты, что критично для создания «лампового» ретро-стиля.
  3. Простота: Мы опишем интерфейс понятным Python-кодом и декларативным языком KV.

Поехали!

Шаг 1. Погружение в атмосферу: Дизайн

Прежде чем писать код, давайте вспомним, как выглядела типичная приборная панель в советской фантастике:

  • Цветовая гамма: Чёрный фон, зелёные/жёлтые символы. Никаких градиентов и полупрозрачностей — только контраст.
  • Элементы: Крупные цифровые индикаторы (текущее время/дата), тумблеры и большие кнопки с надписями.
  • Шрифты: Цифровые, рубленые шрифты, похожие на символы на табло (например, DS-Digital или стандартный Roboto с жирным начертанием) .

Мы создадим главное окно с текущим временем (как точкой отсчёта), полем ввода целевой даты и зелёной кнопкой «Пуск».

Шаг 2. Каркас приложения на Python

Создадим файл main.py. Это будет сердце нашей машины времени.

python

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from kivy.properties import StringProperty
from datetime import datetime
import random

# Это главный виджет, который будет описан в .kv файле
class TimeMachinePanel(BoxLayout):
current_time = StringProperty()
target_date = StringProperty()
status_message = StringProperty('ОЖИДАНИЕ')
is_time_machine_active = False
launch_animation_running = False

def __init__(self, **kwargs):
super().__init__(**kwargs)
# Запускаем обновление времени каждую секунду
Clock.schedule_interval(self.update_time, 1)
self.target_date = "2112.03.29"
# Дата по умолчанию (отсылка к фильму)

def update_time(self, *args):
"""Обновляет текущее время на панели"""
now = datetime.now()
self.current_time = now.strftime("%Y.%m.%d\n%H:%M:%S")

def start_time_jump(self):
"""Запускает 'хроно-импульс' с анимацией"""
if not self.is_time_machine_active:
self.is_time_machine_active = True
self.status_message = 'ПУСК'
self.launch_animation_running = True
# Запускаем анимацию мерцания экрана (эффект перегрузки)
Clock.schedule_interval(self.animate_launch, 0.1)

def animate_launch(self, dt):
"""Имитация помех и 'прыжка'"""
if self.launch_animation_running:
# Генерируем случайные цифры для эффекта сбоя
glitch_time = f"{random.randint(0, 9)}{random.randint(0, 9)}:{random.randint(0, 5)}{random.randint(0, 9)}:{random.randint(0, 5)}{random.randint(0, 9)}"
# Тут мы бы могли обновить self.current_time, но оставим это для следующего шага
pass

def stop_time_jump(self):
"""Экстренная остановка"""
self.is_time_machine_active = False
self.launch_animation_running = False
self.status_message = 'АВАРИЯ'
Clock.unschedule(self.animate_launch)

class TimeMachineApp(App):
def build(self):
return TimeMachinePanel()

if __name__ == '__main__':
TimeMachineApp().run()

Шаг 3. Рисуем интерфейс на KV Language

Теперь самое интересное — дизайн. Создадим файл timemachine.kv. Kivy автоматически подгрузит его, так как имя совпадает с классом App (без суффикса App).

kv

<TimeMachinePanel>:
orientation: 'vertical'
padding: 20
spacing: 10
canvas.before:
# Заливаем фон чёрным цветом, как старый ЭЛТ-монитор
Color:
rgba: 0, 0, 0, 1
Rectangle:
pos: self.pos
size: self.size

# Верхняя панель с текущим временем
BoxLayout:
size_hint_y: 0.4
Label:
text: root.current_time
font_name: 'RobotoMono-Regular' # Моноширинный шрифт для эффекта "цифр"
font_size: min(self.height, self.width) // 6
color: [0.2, 1, 0.2, 1] # Ядовито-зелёный цвет
bold: True
halign: 'center'
valign: 'middle'
markup: True
text_size: self.size

# Блок ввода цели
BoxLayout:
size_hint_y: 0.2
Label:
text: 'ЦЕЛЬ:'
color: [0.3, 0.8, 0.3, 1]
font_size: 20
TextInput:
text: root.target_date
multiline: False
background_color: [0.1, 0.2, 0.1, 1]
foreground_color: [0, 1, 0, 1]
cursor_color: [0, 1, 0, 1]
font_size: 24

# Блок статуса и управления
BoxLayout:
size_hint_y: 0.2
Label:
text: root.status_message
font_size: 32
color: [1, 0.8, 0, 1] if root.status_message == 'ПУСК' else [1, 0, 0, 1]
bold: True
Button:
text: 'ЗАПУСК'
background_color: [0, 0.5, 0, 1]
background_normal: ''
font_size: 24
on_press: root.start_time_jump()
Button:
text: 'СТОП'
background_color: [0.6, 0, 0, 1]
background_normal: ''
font_size: 24
on_press: root.stop_time_jump()

Совет по стилю: Для полного погружения найдите и установите TrueType-шрифт, имитирующий табло. Положите файл .ttf в папку с проектом и укажите его название в font_name .

Шаг 4. Эффект «Хроно-импульса»

Давайте оживим нашу машину. Добавим в класс TimeMachinePanel метод, который во время запуска будет создавать помехи на экране. Дополните метод animate_launch:

python

def animate_launch(self, dt):
if self.launch_animation_running:
# Создаём эффект "бегущих" цифр на дисплее текущего времени
glitch_seconds = datetime.now().second
# Чем дольше прыжок, тем сильнее помехи
self.current_time = f"{random.randint(20, 21)}.{random.randint(0, 3)}{random.randint(0, 9)}.{glitch_seconds:02d}\n{random.randint(0, 2)}{random.randint(0, 9)}:{random.randint(0, 5)}{random.randint(0, 9)}:{random.randint(0, 5)}{random.randint(0, 9)}"

А в методе start_time_jump перед запуском цикла анимации добавьте:

python

Clock.schedule_interval(self.animate_launch, 0.05) # Высокая частота мерцания

Это создаст ощущение, что процессор машины времени не справляется с нагрузкой при попытке открыть хроно-канал.

Шаг 5. Запуск и тестирование

Сохраните оба файла в одной папке и выполните команду:

bash

python main.py

Перед вами появится чёрное окно с зелёными цифрами. Введите желаемую дату (в формате ГГГГ.ММ.ДД), нажмите «Запуск» и наслаждайтесь мерцанием цифр. Вы — в рубке хроно-лаборатории!

-3

Итоги: Ваша личная машина времени готова!

Конечно, это только эмуляция. Мы не отправимся в прошлое, чтобы спасти Алису Селезнёву, но мы создали атмосферный и технически сложный проект всего за несколько десятков строк кода.

Что можно улучшить?

  1. Звук: Добавить файлы .wav с шипением и характерным писком с помощью модуля kivy.core.audio.
  2. Больше графики: Нарисовать стрелочные индикаторы, используя инструкции canvas (Line, Ellipse) .
  3. История прыжков: Создать список совершенных "прыжков" (журнал времени).

Попробуйте модифицировать код: измените цвета на оранжевые (как в фантастическом фильме «Кин-дза-дза!») или добавьте ещё один экран с картой звёздного неба.

Делитесь скриншотами ваших машин времени в комментариях! Чья панель управления окажется самой аутентичной?