Невозможно рисовать пути с помощью cairo на виджетах gtk в python 3

У меня возникли проблемы с визуализацией пользовательской области рисования GTK3 с помощью пользовательского кода cairo. Кажется, что контекст cairo не хочет возиться с формой, которую я указываю. Он записывает весь источник на весь пункт назначения, независимо от формы.

Так, например, если я устанавливаю полностью белую исходную область для рисования небольшого белого прямоугольника и прошу cairo fill() этот прямоугольник, он закрашивает весь виджет DrawingArea вместо этого прямоугольника. Что мне здесь не хватает?

#!/usr/bin/env python3
from gi.repository import Gtk as gtk
from gi.repository import Gdk as gdk
import cairo

class Canvas(gtk.DrawingArea):
    def __init__(self):
        gtk.DrawingArea.__init__(self)
        self.set_size_request(600,400)
        self.connect('draw',Canvas.on_draw)

    def on_draw(self,context):
        context.set_source_rgb( 0.1, 0.0, 0.1 )
        context.fill()
        context.set_source_rgb( 1.0, 1.0, 1.0 )
        context.rectangle(50,50,100,100)
        context.fill()
        context.paint()
        return False

#look at this code
class MainWindow(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self, title="Game Centurion")

        self.dummy0 = gtk.Label(label="dummy₀")
        self.canvas = Canvas()
        self.box = gtk.Box()

        self.box.pack_start(self.canvas, True, True, 0)
        self.box.pack_start(self.dummy0, True, True, 0)

        self.add(self.box)

        self.connect('delete-event', gtk.main_quit)

if __name__ == '__main__':
    w = MainWindow()
    w.show_all()
    gtk.main()

Вот окно результата, вы можете видеть, что оно полностью белое, а не маленький белый квадрат на темно-фиолетовом фоне, как я указал в коде выше.

Результат области рисования

Спасибо за любую помощь.


person Lærne    schedule 15.11.2014    source источник


Ответы (1)


Хорошо, я понял.

Я неправильно понял роль метода paint объекта context. Я думал, что это своего рода «фиксация» для фактического выполнения всех операций, указанных ранее. На самом деле эти операции рисуются «на месте» (или после обратного вызова, я не знаю), а рисование — это операция, которая копирует весь источник в место назначения.

Неудивительно, что это не сработало. так хорошо.

Вот правильный обратный вызов рисования:

def on_draw(self,emitter,context):
    context.set_source_rgb( 0.1, 0.0, 0.1 )
    context.paint()
    context.rectangle(50,50,100,100)
    context.set_source_rgb( 1.0, 1.0, 1.0 )
    context.fill()
    return False
person Lærne    schedule 18.11.2014
comment
Можете ли вы опубликовать полную версию вашего рабочего примера? - person oz123; 12.12.2016