2013-02-21 17 views
5

私はボタンで自分のセルレンダリングを作成する必要があり、私はこの思い付いた:PythonとGTK 3でカスタムGtk.CellRendererを書くには?

#!/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() 

が、そのは動作していない:私は何かが欠けてい

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

:/私のようなエラーの多くを得ます?私はそれを動作させるために何かすべきことがありますか?

答えて

5

do_get_size()do_render()の名前を付けてください。これらは、親クラスの仮想メソッドをオーバーライドしていることをGTKに知らせる特別な名前です。

関連する問題