Thanks. That worked very well. Thanks for taking the time to respond. In celebration, I have added a green rectangle.
Here is the working code: import pygtk pygtk.require("2.0") import gtk from gtk import Window, Button class Base: def handle_color_change(self, widget, data) : self.color = data if self.color == "Red": gdk_color = gtk.gdk.color_parse("Red") elif self.color == "Green": gdk_color = gtk.gdk.color_parse("Green") else: gdk_color = gtk.gdk.color_parse("Blue") style = self.area.get_style().copy() style.bg[gtk.STATE_NORMAL] = gdk_color self.area.set_style(style) self.area.queue_draw() def __init__(self): self.color = None self.window = Window(gtk.WINDOW_TOPLEVEL) self.window.connect("destroy", lambda w: gtk.main_quit()) self.mainPane = gtk.VBox(False, 0) self.window.add(self.mainPane) # create the toolbar self.toolbar = gtk.HBox(False, 0) self.green = Button('Green') self.red = Button ('Red') self.toolbar.pack_start(self.green, True, True, 0) self.toolbar.pack_start(self.red, True, True, 0) self.mainPane.pack_start(self.toolbar, True, True, 0) self.red.connect("clicked", self.handle_color_change, "Red") self.green.connect("clicked", self.handle_color_change, "Green") #Create the drawing area self.area = gtk.DrawingArea() self.area.set_size_request(400, 300) self.area.connect("expose-event", self.area_expose) self.mainPane.pack_start(self.area, True, True, 0) self.window.show_all() def area_expose(self, area, event): print ("area exposed") gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] gc=self.area.window.new_gc() gdk_color = gc.get_colormap().alloc_color("Green") gc.set_foreground(gdk_color) #draw_rectangle(gc, filled, x, y, width, height) self.area.window.draw_rectangle(gc, True, 0, 0, 80, 70) gdk_color = gc.get_colormap().alloc_color("Blue") gc.set_foreground(gdk_color) self.area.window.draw_line(gc, 0, 0, 80, 70) return False def main(self): gtk.main() if __name__ == "__main__": base = Base() base.main() And now I do a victory dance... hoot hoot! hoot hoot! HOOT! Mdd dada do do doh mmm dada doh doh! bogaboga! On Wed, Sep 2, 2009 at 8:16 PM, John Finlay <fin...@moeraki.com> wrote: > Rick Hightower wrote: > > <snip> > >> Here is the full program. It changes the background color and redraws. >> I need to be able to draw different color lines. >> >> import pygtk >> pygtk.require("2.0") >> import gtk >> from gtk import Window, Button >> >> class Base: >> def handle_color_change(self, widget, data) : >> self.color = data >> if self.color == "Red": >> gdk_color = gtk.gdk.color_parse("Red") >> elif self.color == "Green": >> gdk_color = gtk.gdk.color_parse("Green") >> else: >> gdk_color = gtk.gdk.color_parse("Blue") >> style = self.area.get_style().copy() >> style.bg <http://style.bg>[gtk.STATE_NORMAL] = gdk_color >> >> self.area.set_style(style) >> self.area.queue_draw() >> >> def __init__(self): >> self.color = None >> self.window = Window(gtk.WINDOW_TOPLEVEL) >> self.window.connect("destroy", lambda w: gtk.main_quit()) >> >> self.mainPane = gtk.VBox(False, 0) >> self.window.add(self.mainPane) >> # create the toolbar >> self.toolbar = gtk.HBox(False, 0) >> self.green = Button('Green') >> self.red = Button ('Red') >> self.toolbar.pack_start(self.green, True, True, 0) >> self.toolbar.pack_start(self.red, True, True, 0) >> self.mainPane.pack_start(self.toolbar, True, True, 0) >> self.red.connect("clicked", self.handle_color_change, "Red") >> self.green.connect("clicked", self.handle_color_change, "Green") >> >> >> #Create the drawing area >> self.area = gtk.DrawingArea() >> self.area.set_size_request(400, 300) >> self.area.connect("expose-event", self.area_expose) >> self.mainPane.pack_start(self.area, True, True, 0) >> >> self.window.show_all() >> >> def area_expose(self, area, event): >> print ("area exposed") >> > vvvvv delete vvvvvv > >> gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] >> gdk_color = gtk.gdk.color_parse("Blue") >> gc.get_colormap().alloc_color(gdk_color) >> > ^^^^^^ delete ^^^^^^^ > > vvvvvvvvv add vvvvvvvvv > > gc=self.area.window.new_gc() > gdk_color = gc.get_colormap().alloc_color("Blue") > > ^^^^^^ add ^^^^^^ > >> gc.set_foreground(gdk_color) >> self.area.window.draw_line(gc, 0, 0, 80, 70) >> return False >> >> def main(self): >> gtk.main() >> >> if __name__ == "__main__": >> base = Base() >> base.main() >> >> > You could create the GC and color up front and reuse it in the expose > event handler to simplify. > > john >
_______________________________________________ pygtk mailing list pygtk@daa.com.au http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://faq.pygtk.org/