Search code examples
pythongtk

"Pixmap" migration on Gtk 3


I have a python 2 project using GTK2.
I am working on this project to migrate python 2 to python 3 and Gtk2 to Gtk 3.
I have a problem with the Gtk migration.
I want to replace “gdk. Pixmap” in my code.
I found this documentation:

Replace GdkPixmap by cairo surfaces The GdkPixmap object and related functions have been removed. In the Cairo-centric world of GTK 3, Cairo surfaces take over the role of pixmaps.

I have to use Cairo, but I don’t know how.
I spent a lot of time looking for examples in python.
I didn’t find anything that matched my code.
Can someone help me, give me references?

Python2 :

class TraceView(gtk.DrawingArea):

     …

    def configure_event(self, widget, event):
        _, _, width, height = widget.get_allocation()
        self.pixmap = Pixmap(widget.window, width, height)
        self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height)
        ...
        return True

    def expose_event(self, widget, event):
        x, y, width, height = event.area
        widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL],
                                    self.pixmap, x, y, x, y, width, height)
        self.maj_exposed()
        ...
        return False

Python3 :

class TraceView(Gtk.DrawingArea):

     …

    def configure_event(self, widget, event):
        width = widget.get_allocated_width()
        height = widget.get_allocated_height()
        self.pixmap = ?
        self.pixmap. … ?
        ...
        return True

    def draw(self, widget, event):
        ???
        self.maj_exposed()
        ...
        return False

Solution

  • This is a minimal example of gtk3 program that draws a rectangle

    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import Gtk
    
    class MinimalCairoTest(Gtk.Window):
    
        def __init__(self):
            super(MinimalCairoTest, self).__init__()
            self.set_size_request(400, 400)
            self.connect("destroy", Gtk.main_quit)
            darea = Gtk.DrawingArea()
            darea.connect("draw", self.__draw_cb)
            self.add(darea)
            self.show_all()
    
        def __draw_cb(self, widget, cairo_context):
            cairo_context.set_source_rgb(1.0, 0.0, 0.0)
            cairo_context.rectangle(20, 20, 120, 80)
            cairo_context.fill()
    
    
    MinimalCairoTest()
    Gtk.main()
    

    enter image description here

    You can find more examples about how to draw with cairo here https://seriot.ch/pycairo/ and documentation here https://pycairo.readthedocs.io/en/latest/reference/context.html