2013-08-10 13 views
5

Gtk-3 için yazılan özel bir parçacığın en basit örneğini bulmaya çalışıyorum.GTK3 ile özel pencere eşiği yazma

Şimdiye kadar bulduğum en iyi şey, this (PyGTK kullanarak), ancak Gtk-2'ye hedeflenmiş gibi görünüyor.

BTW: Yazılan dili umursamıyorum, ancak C++ 'yı önleyebilirsek çok daha iyi!

cevap

0

C: http://ptomato.name/advanced-gtk-techniques/html/custom-container.html'da bir GTK 3 özel kapsayıcı pencere aracının yazılmasıyla ilgili bir öğretici var. Basit bir pencere öğesi yazmak için gerekenden daha karmaşık olabilir. Ayrıca 3'e GTK 2'den geçiş kılavuzuna göz atabilirim diye: https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html

+0

Bu blog'unuzdan değil mi? "Bu, GTK 2'de çalışılan şeylerden oldukça farklıdır ve muhtemelen internette dolaşan GTK 2 talimatının büyük bir kısmı vardır." Bunu daha açık hale getirmek için bir GTK 3 tekniği olduğunu açıkça söylemenizi tavsiye ederim. – knocte

+0

ve bu cevabı gerçekten bir örnek vermediğinden, bu cevabı SOLVED olarak işaretleyeceğime emin değilim, ancak – knocte

+0

numaralı bağlantı için teşekkürler, cevabınızı da tatmin edici bir şekilde yanıtlayacağını düşünmüyorum. :-( – ptomato

11

Python3 Gtk3 öyle, o zaman: Burada

from gi.repository import Gtk 

class SuperSimpleWidget(Gtk.Label): 
    __gtype_name__ = 'SuperSimpleWidget' 

aslında bir şey yapar önemsiz olmayan bir örnektir, yani boyalar onun arka plan ve içinden çapraz bir çizgi çizer. (Aşağıya bakınız) bazı klişe kurtarmak için Gtk.Misc yerine Gtk.Widget devralan ediyorum:

class SimpleWidget(Gtk.Misc): 
    __gtype_name__ = 'SimpleWidget' 

    def __init__(self, *args, **kwds): 
     super().__init__(*args, **kwds) 
     self.set_size_request(40, 40) 

    def do_draw(self, cr): 
     # paint background 
     bg_color = self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL) 
     cr.set_source_rgba(*list(bg_color)) 
     cr.paint() 
     # draw a diagonal line 
     allocation = self.get_allocation() 
     fg_color = self.get_style_context().get_color(Gtk.StateFlags.NORMAL) 
     cr.set_source_rgba(*list(fg_color)); 
     cr.set_line_width(2) 
     cr.move_to(0, 0) # top left of the widget 
     cr.line_to(allocation.width, allocation.height) 
     cr.stroke() 

gerçekten Gtk.Widget kaynaklanıyor edinmek istiyorsanız, o zaman da bir çizim arka planı kurmak zorunda. Gtk.Misc sizin için yapar, ancak Gtk.Widget aslında kendisinin bir şey çizmeyen bir kap olabilir. Ama soran beyinler bilmek istiyorum, bu yüzden şöyle yapabileceğini :

from gi.repository import Gdk 

class ManualWidget(Gtk.Widget): 
    __gtype_name__ = 'ManualWidget' 

    def __init__(self, *args, **kwds): 
     # same as above 

    def do_draw(self, cr): 
     # same as above 

    def do_realize(self): 
     allocation = self.get_allocation() 
     attr = Gdk.WindowAttr() 
     attr.window_type = Gdk.WindowType.CHILD 
     attr.x = allocation.x 
     attr.y = allocation.y 
     attr.width = allocation.width 
     attr.height = allocation.height 
     attr.visual = self.get_visual() 
     attr.event_mask = self.get_events() | Gdk.EventMask.EXPOSURE_MASK 
     WAT = Gdk.WindowAttributesType 
     mask = WAT.X | WAT.Y | WAT.VISUAL 
     window = Gdk.Window(self.get_parent_window(), attr, mask); 
     self.set_window(window) 
     self.register_window(window) 
     self.set_realized(True) 
     window.set_background_pattern(None) 

Düzenleme ve aslında kullanmak için:

w = Gtk.Window() 
w.add(SimpleWidget()) 
w.show_all() 
w.present() 
import signal # enable Ctrl-C since there is no menu to quit 
signal.signal(signal.SIGINT, signal.SIG_DFL) 
Gtk.main() 

Ya da daha eğlenceli, doğrudan kullanmak ipython3 REPL:

from IPython.lib.inputhook import enable_gtk3 
enable_gtk3() 
w = Gtk.Window() 
w.add(SimpleWidget()) 
w.show_all() 
w.present() 
+0

cool! Bunu, bunu işleyen basit bir uygulama ile nasıl çalıştırabilirsiniz? – knocte

İlgili konular