2015-05-01 5 views
1

Прошло некоторое время, когда я пытался разместить область рисования в прокрученном окне. Я читал статьи о решениях pygtk и C, но я думаю, что они не работают в pyGobject.GTK3 + (3.14) область рисования на scrolledwindow

Я сделал минимальный пример:

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

Пожалуйста, не указывают мне на следующие статьи, я уже прочитал их несколько раз!

Я добавил viewport и size_request, что еще могло не быть?

Спасибо за помощь!

ответ

0

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

Вы должны прочитать ссылки API для GTK + 3.x:

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

, а также ссылки API Python :

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

0

Вы можете добавить область повреждения и заставить перерисовать, я слегка модифицирован вам пример (жаль, что я не мог сопротивляться фиксируя пару вещей) и добавить queue_draw_area

Я бы настоятельно рекомендую избегать использования Gtk .DrawingArea и используя виджет холста вместо этого, используя холст, это намного проще, GooCanvas - хороший пример, но есть много других, которые вы можете использовать.

from gi.repository import Gtk, Gdk 
import math, cairo 

class Test(Gtk.Window): 

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

     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.pack_start(da, True, True, 10) 

     sw.add(box) 
     self.add(sw) 

     self.connect("destroy", Gtk.main_quit) 
     self.show_all() 

    def draw(self, widget, event, color, da): 
     cr = widget.get_property('window').cairo_create() 
     lg1 = cairo.LinearGradient(0.0, 0.0, 100, 0) 
     lg1.add_color_stop_rgb(0, color[0], color[1], color[2]) 
     lg1.add_color_stop_rgb(1, color[0], color[1], color[2]) 
     cr.rectangle(0, 0, 100, 100) 
     cr.set_source(lg1) 
     cr.fill() 
     da.queue_draw_area(0, 0, 100, 100) 

main=Test() 
Gtk.main() 
+0

Здравствуйте, gianmt, не волнуйтесь за модификации, которые были всего лишь минимальным примером. Я выполнил ваш код, и у меня все еще есть те же проблемы. Вы проверили свой код? Проблема заключается в том, что прокручиваемое окно активно (с обеими полосами). Я закончил gtk 3.12 – rsm

+0

Привет rsm, я проверил его, gtk 3.16, хотя – gianmt

+0

ах: /, возможно, это и есть причина. Я открою сообщение, если кто-нибудь найдет решение, более 3.14. gtk 3.16 он еще не находится в Debian:/ – rsm