Холст Python GTK+

В настоящее время я изучаю GTK + через PyGobject и мне нужно что-то вроде холста. Я уже просмотрел документы и нашел два виджета, которые, похоже, справятся с этой задачей: GtkDrawingArea и GtkLayout. Мне нужно несколько основных функций, таких как fillrect или drawline... На самом деле эти функции доступны из c, но я не смог найти инструкции, как их использовать из python. Можете ли вы порекомендовать учебник или справочную страницу, посвященную их эквивалентам Python?

Если у вас есть лучшее представление о том, как получить что-то похожее на холст, каждый совет будет оценен по достоинству. Я все еще учусь, и пока это можно встроить в мое приложение Gtk, я буду доволен любым решением.


person lhk    schedule 22.12.2011    source источник
comment
Подходящим виджетом для этого является GtkDrawingArea. У меня сейчас нет сэмпла, но вы должны использовать pycairo для рисования в качестве реакции на событие expose.   -  person rodrigo    schedule 22.12.2011
comment
Это означает, что GtkDrawingArea — это всего лишь контейнер, который может быть заполнен другими фреймворками? Включен ли холст в GTK+?   -  person lhk    schedule 22.12.2011
comment
@rodrigo Сигнал expose-event был заменен сигналом draw в gtk3 в соответствии с ссылкой руководство.   -  person jcollado    schedule 23.12.2011
comment
Я читал о pycairo и возможности заполнить область рисования. Кажется, можно позволить pygame выполнить эту работу. Однако распространено мнение, что интеграция pygame в gtk+ означает проблемы: происходит сбой систем событий/механизмов обновлений. Я должен признать: поскольку я уже использовал pygame, я хотел бы использовать его снова, поэтому я немного предвзят.   -  person lhk    schedule 23.12.2011
comment
Что выделяет пикайро? @rodrigo, почему ты это порекомендовал?   -  person lhk    schedule 23.12.2011
comment
@lhk - Cairo - это в значительной степени стандартная бесплатная (как и свобода) библиотека 2D-графики, по крайней мере, в системах * nix. PyCairo просто оборачивает его. Встраивание PyGame в GTK для меня -1. :)   -  person mac    schedule 23.12.2011
comment
@lhk Современный и рекомендуемый способ рисования в GTK + - это использование cairo (фактически единственный способ в Gtk + 3). Поэтому, если вы используете PyGTK, то использование PyCairo вполне ожидаемо.   -  person rodrigo    schedule 23.12.2011


Ответы (1)


Чтобы проиллюстрировать мои мысли, сделанные в комментариях, позвольте мне опубликовать быстрый пример PyGtk, который использует GtkDrawingArea для создания холста и рисует на нем с помощью cairo.

ПОПРАВКА: вы сказали PyGObject, то есть Gtk+3, поэтому пример такой (главное отличие в том, что нет события expose, вместо него draw и контекст cairo уже передается как параметр):

#!/usr/bin/python
from gi.repository import Gtk
import cairo
import math

def OnDraw(w, cr):
    cr.set_source_rgb(1, 1, 0)
    cr.arc(320,240,100, 0, 2*math.pi)
    cr.fill_preserve()

    cr.set_source_rgb(0, 0, 0)
    cr.stroke()

    cr.arc(280,210,20, 0, 2*math.pi)
    cr.arc(360,210,20, 0, 2*math.pi)
    cr.fill()

    cr.set_line_width(10)
    cr.set_line_cap(cairo.LINE_CAP_ROUND)
    cr.arc(320, 240, 60, math.pi/4, math.pi*3/4)
    cr.stroke()

w = Gtk.Window()
w.set_default_size(640, 480)
a = Gtk.DrawingArea()
w.add(a)

w.connect('destroy', Gtk.main_quit)
a.connect('draw', OnDraw)

w.show_all()

Gtk.main()
person rodrigo    schedule 22.12.2011
comment
Хорошо, преимущества перед интеграцией pygame более чем очевидны. Тот факт, что каирский контекст обеспечен событием, просто прекрасен. Я отмечу это как ответ на вопрос. Конечно, я был бы признателен за альтернативные идеи, хотя это кажется идеальным. - person lhk; 23.12.2011