2014-11-15 6 views
1

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

Так, например, если я установил полностью белую область источника, чтобы нарисовать маленький белый прямоугольник, и я спрошу у 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() 

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

DrawingArea Result

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

ответ

2

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

Я неправильно понял роль метода 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 
+0

вы можете опубликовать полную версию рабочего примера? – Oz123

 Смежные вопросы

  • Нет связанных вопросов^_^