2013-08-10 5 views
5

Я пытаюсь найти простейший пример пользовательского виджета, написанного для Gtk-3.Написать пользовательский виджет с GTK3

Пока что лучшая вещь, которую я нашел, - this (с использованием PyGTK), но, похоже, она нацелена на Gtk-2.

BTW: Мне все равно, на каком языке он написан, но если мы сможем избежать C++, гораздо лучше!

ответ

0

Вот учебник по написанию пользовательского контейнера-виджета GTK 3 в C: http://ptomato.name/advanced-gtk-techniques/html/custom-container.html Это, вероятно, сложнее, чем вам нужно для написания простого виджета. Вы также можете проверить руководство по миграции с GTK 2 до 3: https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html

+0

это из вашего блога? когда вы говорите: «Это сильно отличается от того, как все работает в GTK 2, и, вероятно, в Интернете есть много инструкций GTK 2». Я рекомендую вам прямо сказать, что это технология GTK 3, чтобы сделать ее более явной. – knocte

+0

и не уверен, что я собираюсь отметить этот ответ как SOLVED, потому что он действительно не дает образец, но спасибо за ссылку – knocte

+0

Правильно, я не думаю, что он удовлетворительно отвечает на ваш вопрос. :-( – ptomato

11

Python3 GTK3 это, то:

from gi.repository import Gtk 

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

Вот нетривиальный пример того, что на самом деле делает что-то, а именно рисует его фон и рисует диагональную линию через него. Я унаследовав от Gtk.Misc вместо Gtk.Widget сэкономить шаблонного (см):

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

Наконец, если вы действительно хотите получить от Gtk.Widget, то вы также должны создать фон для рисования. Gtk.Misc делает это для вас, но Gtk.Widget может быть контейнером, который на самом деле ничего не рисует. Но пытливые умы хотят знать, так что вы могли это сделать так:

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) 

Edit и на самом деле использовать его:

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

Или, больше удовольствия, использовать его непосредственно из ipython3 РЕПЛ:

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

cool! как запустить это с помощью простого приложения gtk, которое отображает его? – knocte

0

до сих пор лучший ссылка:
- и nderstand GObject (от Wich GTK виджет Выведите)
- есть некоторый код котла и код С

https://developer.gnome.org/gobject/stable/howto-gobject.html

Я знаю, что это не Python написано, но преобразование от с до питон кусок пирога (что важно, это алгоритм, а не язык)

Смежные вопросы