[pygtk] Trying to change the "pen color" just before I draw a line

John Finlay finlay at moeraki.com
Thu Sep 3 11:16:33 WST 2009


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


More information about the pygtk mailing list