2013-02-21 14 views
5

muszę napisać własny mechanizm renderujący komórki za pomocą przycisku, wymyśliłem to:Jak napisać niestandardowy Gtk.CellRenderer w python i GTK 3?

#!/usr/bin/env python3 
from gi.repository import Gtk 

class CellRendererButton(Gtk.CellRenderer): 
    def __init__(self): 
     Gtk.CellRenderer.__init__(self) 

    def get_size(self, widget, cell_area): 
     buttonHeight = cell_area.height 
     buttonWidth = buttonHeight 
     return (0, 0, buttonWidth, buttonHeight) 

    def render(self, window, widget, background_area, cell_area, expose_area, flags): 
     style = widget.get_style() 
     x, y, buttonWidth, buttonHeight = self.get_size() 
     style.paint_box(window, widget.get_state(), Gtk.SHADOW_ETCHED_OUT, expose_area, widget, None, 0, 0, buttonWidth, buttonHeight) 

class MyWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self, title = 'T', default_width = 200, default_height = 300) 
     self.connect('destroy', self.__onDestroy) 
     self.__createGUI() 
     self.show_all() 

    def __createGUI(self): 
     box = Gtk.Box(orientation = Gtk.Orientation.VERTICAL) 
     listStore = Gtk.ListStore(str, str) 
     treeView = Gtk.TreeView(listStore) 
     textRenderer = Gtk.CellRendererText() 
     textColumnA = Gtk.TreeViewColumn(None, textRenderer) 
     textColumnB = Gtk.TreeViewColumn(None, textRenderer) 
     buttonRenderer = CellRendererButton() 
     buttonColumn = Gtk.TreeViewColumn(None, buttonRenderer) 
     textColumnA.add_attribute(textRenderer, 'text', 0) 
     textColumnB.add_attribute(textRenderer, 'text', 1) 
     treeView.append_column(textColumnA) 
     treeView.append_column(textColumnB) 
     treeView.append_column(buttonColumn) 
     listStore.append(('my string', 'my string')) 
     self.add(treeView) 

    def __onDestroy(self, e): 
     Gtk.main_quit() 

t = MyWindow() 
Gtk.main() 

ale jej nie działa:/mam mnóstwo błędów typu:

(game.py:4736): Gtk-CRITICAL **: gtk_cell_renderer_render: assertion `GTK_CELL_RENDERER_GET_CLASS (cell)->render != NULL' failed 

ja czegoś brakuje ? Czy jest coś, co powinienem zrobić, aby to zadziałało?

Odpowiedz

5

Powinieneś nazwać swoje metody do_get_size() i do_render(). Są to specjalne nazwy, które pozwalają GTK wiedzieć, że nadpisujesz wirtualną metodę klasy nadrzędnej.

Powiązane problemy