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()
Instead of calling
do_realize
in__init__
, I should be callingqueue_draw
. I got help on the pygtk irc.