Используя библиотеку Gtk+, Drawing Area Widget и cairo.Context объект загружаем шарик (картинку) в окно программы и создаём плавное колебательное движение шарика по криволинейной траектории. Создаём программу на Python помощью конструктора Glade и IDE IDLE.
В IDE Glade создайте новый проект.
Создайте Окно класса GtkWindow, на вкладке Основные свойства присвойте ему идентификатор ID: window. Там же, на вкладке Основные свойства присвойте окну Заголовок GtkDrawingArea и проставьте размер и галочки Ширина по умолчанию 800 и Высота по умолчанию 600. На вкладке Сигналы в разделе GtkWidget событию destroy задайте обработчик on_destroy.
Поверх окна window разместите Display GtkDrawingArea. На вкладке Основные свойства задайте ему имя colorDraw.
В IDE Glade сохраните проект под именем, например, examle. В результате вы получите файл example.glade:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="title" translatable="yes">GtkDrawingArea</property>
<property name="default_width">800</property>
<property name="default_height">600</property>
<signal name="destroy" handler="on_destroy" swapped="no"/>
<child>
<placeholder/>
</child>
<child>
<object class="GtkDrawingArea" id="colorDraw">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
</object>
</interface>
В текстовом редакторе или, например, в IDE IDLE напишите программу example.py следующего содержания:
#!/usr/bin/python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width:$
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject
import os, random, time, math, numpy, cairo
XML_FILE = "example.glade"
t = 0.0
dt = 0.01
x = y = 0
a = b = 200
w1 = 7
w2 = 5
img = cairo.ImageSurface.create_from_png('blue.png')
def do_draw(self, cr):
global x, y, t, dt, a, b, w1, w2, img
width = self.get_allocated_width()
height = self.get_allocated_height()
x0 = width/2-25
y0 = height/2-25
cr.set_source_surface(img, x+x0, y+y0)
cr.paint()
t += dt
x=a*math.cos(w1*t)
y=b*math.cos(w2*t)
def timeout():
time.sleep(0.005)
colordr.queue_draw()
return True
class Handler:
def on_destroy(self, *args):
Gtk.main_quit()
builder = Gtk.Builder()
builder.add_from_file(XML_FILE)
builder.connect_signals(Handler())
win = builder.get_object("window")
colordr = builder.get_object("colorDraw")
colordr.connect('draw', do_draw)
win.show_all()
GObject.idle_add(timeout)
Gtk.main()
Наш проект состоит их 2-х файлов example.py иexample.glade. Теперь можно запускать нашу программу через терминал в папке проекта или через IDE IDLE:
dior@U18pro:~/Python/Example/Gtk Drawin Area$ ./example.py
Работает: