pygtk custom widgets displaying in separate window

441 Views Asked by At

I'm having trouble with custom widgets showing up in a separate window. Separate window not in the sense of all widgets being in a window, but they all come up separately with their own window decorations. I'm not sure where the problem would be, but I guessed it might be in one of the following, maybe to do with how I'm creating the window. do_realize is called in init (which also appears below), and I think do_expose_event is called by gtk when it's asked to draw itself, but I'm not really sure (I'm very new to all this). I put a print statement in do_expose_event, and it is called for each after a print statement that I placed immediately before entering gtk main in the program that makes the widgets. All of the code is GPLed.

If any other code is needed it's available on request.

def do_realize(self):
    """Makes a window on which we draw"""

    #set a flag to say we are realised
    self.set_flags(self.flags() | gtk.REALIZED)

    #make a gdk window to draw on
    self.window = gtk.gdk.Window(self.get_parent_window(), width=self.allocation.width,
                    height=self.allocation.height, window_type=gtk.gdk.WINDOW_CHILD,
                    wclass=gtk.gdk.INPUT_OUTPUT, event_mask=self.get_events() | gtk.gdk.EXPOSURE_MASK)

    #associate the window with the widget
    self.window.set_user_data(self)

    #attach a style
    self.style.attach(self.window)

    #set the default background colour to whatever the theme says, and the state
    self.style.set_background(self.window, gtk.STATE_NORMAL)
    self.window.move_resize(*self.allocation)

def do_expose_event(self, event):
    """Called when the widget is asked to draw itself"""
    #put the allocation in some variables
    x, y, w, h = self.allocation
    cr = self.window.cairo_create()


    #if height is greater than width
    if (h > w):
        scale = h/float(BASE_SIZE)
    else:
        scale = w/float(BASE_SIZE)

    #set the scale
    cr.scale(scale,scale)

    #put in the colour
    self.draw_background_color(cr)

    #draw the highlight if necessary
    if self.is_focus():
        self.draw_highlight_box(cr)

    self.draw_normal_box(cr)
    self.draw_text(cr)
    if self.draw_boxes and self.is_focus():
        self.draw_note_area_highlight_box(cr)

def __init__(self, upper=9, text=''):
    """initialise it"""
    gtk.Widget.__init__(self)       #init the super class
    self.upper = upper
    self.font = self.style.font_desc
    self.font.set_size(pango.SCALE*13)
    self.note_font = self.font.copy()
    self.note_font.set_size(pango.SCALE*6)

    #set properties-can focus and grab all events
    self.set_property('can-focus',True)
    self.set_property('events',gtk.gdk.ALL_EVENTS_MASK)

    #connect the events to functions
    self.connect('button-press-event',self.button_press)        #box is clicked on
    self.connect('key-release-event',self.key_press)            #release of key when inputting
    self.connect('enter-notify-event',self.pointer_enter)       #pointer enters
    self.connect('leave-notify-event',self.pointer_leave)       #pointer leaves
    self.connect('focus-in-event',self.focus_in)                #goes into focus
    self.connect('focus-out-event',self.focus_out)              #goes out of focus
    self.connect('motion-notify-event',self.motion_notify)      #poniter is in the window

    #debugging info
    #print type(self)

    self.set_text(text)
    self.do_realize()
1

There are 1 best solutions below

1
On

Instead of calling do_realize in __init__, I should be calling queue_draw. I got help on the pygtk irc.