import random
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib
class MovingParrotWindow(Gtk.Window):
def __init__(self):
super().__init__(title="Бегающий попугайчик")
self.set_default_size(400, 300)
# Используем Gtk.Fixed, чтобы можно было двигать виджет по точным координатам (x, y)
self.fixed = Gtk.Fixed()
self.add(self.fixed)
# Создаем метку с попугайчиком
self.label = Gtk.Label(label="🦜")
# Увеличиваем размер шрифта через CSS
css_provider = Gtk.CssProvider()
css_provider.load_from_data(b"label { font-size: 36pt; }")
self.label.get_style_context().add_provider(
css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)
# Добавляем попугайчика на холст
self.fixed.put(self.label, 50, 50)
# Начальные координаты и скорость движения
self.x = 50.0
self.y = 50.0
self.dx = 30.0 # Скорость по X
self.dy = 20.0 # Скорость по Y
# Запускаем таймер: функция update_position будет вызываться каждые 30 миллисекунд
GLib.timeout_add(30, self.update_position)
self.connect("destroy", Gtk.main_quit)
def update_position(self):
# Получаем текущие размеры окна, чтобы попугайчик не улетал за границы
allocation = self.get_allocation()
win_width = allocation.width
win_height = allocation.height
# Меняем координаты
self.x += self.dx
self.y += self.dy
# Отскок от правой и левой границ
if self.x <= 0 or self.x >= win_width - 60:
self.dx *= -1
# Отскок от верхней и нижней границ
if self.y <= 0 or self.y >= win_height - 60:
self.dy *= -1
# Перемещаем попугайчика на новые координаты
self.fixed.move(self.label, int(self.x), int(self.y))
# Возвращаем True, чтобы таймер продолжал работать
return True
# Запуск приложения
win = MovingParrotWindow()
win.show_all()
Gtk.main()
Запускать так:
$ python3 app.py
При запуске попугайчик бегает по экрану








