Search code examples
pythongtk3pygobjectdrawingareagtkscrolledwindow

GTK3+ (3.14) drawing area on scrolledwindow


It makes a while that I've been trying to put a drawing area on a scrolled window. I've been reading articles about pygtk and C solutions but I think that they are not working in pyGobject.

I made a minimal example:

from gi.repository import Gtk, Gdk
import cairo

class Test(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        sw=Gtk.ScrolledWindow()
        vp=Gtk.Viewport()
        box=Gtk.VBox()

        vp.set_size_request(100,100)

        for i in range(3):
            da=Gtk.DrawingArea()
            da.connect("draw", self.draw, [0.3, 0.4, 0.6], da)
            da.set_size_request(100,100)
            box.add(da)

        sw.add(vp)
        vp.add(box)        
        self.add(sw)
        self.show_all()

    def draw(self, widget, event, color, da):
        cr = widget.get_property('window').cairo_create()
        cr.rectangle(0, 0, 100, 100)
        cr.set_source_rgb(color[0], color[1], color[2])
        cr.fill()

main=Test()
Gtk.main()

So the problem is that the drawing areas are not always rendered. This is for example, a gtk2 working code:

import gtk, cairo

class Test(gtk.Window):

    def __init__(self):
        gtk.Window.__init__(self)
        sw=gtk.ScrolledWindow()
        vp=gtk.Viewport()
        box=gtk.VBox()

        for i in range(3):
            da=gtk.DrawingArea()
            da.connect("expose-event", self.draw, [0.3, 0.4, 0.6], da)
            box.add(da)

        sw.add(vp)
        vp.add(box)        
        self.add(sw)
        self.show_all()

    def draw(self, widget, event, color, da):
        cr = widget.get_property('window').cairo_create()
        cr.rectangle(0, 0, 100, 100)
        cr.set_source_rgb(color[0], color[1], color[2])
        cr.fill()

main=Test()
gtk.main()

Please do not point me to the following articles, I've already read them multiple times!

I've added the viewport and a size_request, what else could be missing?

Thanks for the help!


Solution

  • by Emmanuele over the Gtk mailing list:

    from gi.repository import Gtk, Gdk
    import cairo
    
    class Test(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self)
            sw=Gtk.ScrolledWindow()
            vp=Gtk.Viewport()
            box=Gtk.VBox()
    
            vp.set_size_request(100,100)
    
            for i in range(3):
                da=Gtk.DrawingArea()
                da.connect("draw", self.draw, [0.3, 0.4, 0.6])
                da.set_size_request(100,100)
                box.add(da)
    
            sw.add(vp)
            vp.add(box)        
            self.add(sw)
            self.show_all()
    
        def draw(self, widget, cr, color):
            cr.rectangle(0, 0, 100, 100)
            cr.set_source_rgb(color[0], color[1], color[2])
            cr.fill()
            cr.queue_draw_area(0, 0, 100, 100)
    
            return True
    
    main=Test()
    Gtk.main()
    

    You should read the API reference for GTK+ 3.x:

    https://developer.gnome.org/gtk/stable

    as well as the Python API reference:

    http://lazka.github.io/pgi-docs/#Gtk-3.0