[pygtk] custom widget help

jon heise jubei at csh.rit.edu
Thu Dec 21 06:12:08 WST 2006


Hi i'm trying to write a composite widget with pygtk however i've been 
running into trouble when i try loading it. following is the code my 
code and below that is error i get at run time.


import gobject
import gtk

from gtk import gdk

if gtk.pygtk_version < (2,0):
    print "PyGtk 2.0 or later required for this"
    raise SystemExit


"""
class ComboButtonException(Exception):
    def __str__(self):
        return repr(
            "!!!Error!!!! combobutton must be create with a list or 
tuple " 
"""

class ComboButton(gtk.Widget):

    def __init__(self,menuitems):
        gtk.Widget.__init__(self)
        """
        if( !(isinstance(menuitems,types.TupleType) or
            isinstance(menuitems,type.ListType))):
                raise(ComboButtonException())
        """
        box = gtk.HBox(False,0)
        box.set_border_width(2)
        menu = gtk.Menu()
        for i in menuitems:
            item = gtk.MenuItem(i)
            item.show()
            menu.append(item)
            item.connect( "activate",self.menu_response,i)

        self.button = gtk.Button()
        arrow = gtk.Arrow(gtk.ARROW_DOWN,gtk.SHADOW_IN)
        self.button.add(arrow)
        box.add(self.button)

        self.entry = gtk.Entry()
        box.add(self.entry)

        box.show_all()

    def do_realize(self):
        self.set_flags(self.flags() | gtk.REALIZED)
        self.window = gtk.gdk.Window(
            self.get_parent_window(),
            width=self.allocation.width,
            height=self.allocation.height,
            window_type = gdk.WINDOW_CHILD,
            wclass=gdk.INPUT_OUTPUT,
            event_mask=self.get_events() | gtk.gdk.EXPOSURE_MASK|
                gtk.gdk.BUTTON1_MOTION_MASK| gtk.gdk.BUTTON_PRESS_MASK|
                gtk.gdk.POINTER_MOTION_MASK| 
gtk.gdk.POINTER_MOTION_HINT_MASK)

        self.window.set_user_data(self)
        self.style.attach(self.window)
        self.style.set_background(self.window,gtk.STATE_NORMAL)
        self.window.mone_resize(*self.allocation)

    def do_unrealize(self):
        self.window.destroy()

    def do_size_request(self,requisition):
        requisition.height = 14
        requisition.width = 30

    def do_size_allocate(self,allocation):
        self.allocation = allocation
        if self.flags() & gtk.REALIZED:
            self.window.move_resize(*allocation)

    def do_expose_event(self,event):
        self.button.do_expose_event(self,event)
        self.entry.do_expose_event(self,event)
    def button_popup(self,widget,event,menu):
        if event.type == gtk.gdk.BUTTON_PRESS:
            menu.popup(None,None,None,event.button,event.time)
            return True
        return False

    def menu_response(self,widget,str):
        print "%s was clicked" % str
        buffer = self.entry.get_text()
        self.entry.set_text(buffer + str )


    def entry_call(self,widget,event):
        print "event is of %s type" % event.type

    def set_active(self,number):
        pass
    def get_text(self):
        return self.entry.get_text()

    def set_text(self,text):
        self.entry.set_text(text)

/---- end code

Traceback (most recent call last):
  File "/home/jubei/code/nokia/trunk/nokiagui.py", line 427, in ?
      gui = NewGui()
  File "/home/jubei/code/nokia/trunk/nokiagui.py", line 193, in __init__
      button = pkylib.ComboButton(("foo","bar","baz"))
  File "/home/jubei/code/nokia/trunk/pkylib.py", line 21, in __init__
      gtk.Widget.__init__(self)
TypeError: cannot create instance of abstract (non-instantiable) type 
`GtkWidget'







More information about the pygtk mailing list