滚动窗口上的GTK3 +(3.14)绘图区域

时间:2015-05-01 15:02:42

标签: python gtk3 pygobject drawingarea gtkscrolledwindow

我花了一段时间试图在滚动的窗口上放置一个绘图区域。我一直在阅读有关pygtk和C解决方案的文章,但我认为它们不适用于pyGobject。

我做了一个小例子:

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()

所以问题是绘图区域并不总是呈现。例如,这是一个gtk2工作代码:

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()

请不要指出以下文章,我已多次阅读它们了!

我添加了viewportsize_request,还有什么可以遗漏?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Emmanuele在Gtk邮件列表中

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()

您应该阅读GTK + 3.x的API参考:

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

以及Python API参考:

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