tags:

views:

255

answers:

2

I'm trying to show the "selection" of a certain sub-string in a gtk.TextView by drawing a border around the word. The only way to mark text in a TextView that I've found so far is by placing TextTags with modified properties. This does not seem to offer a way to draw a border, though, DOES GTK SUPPORT THIS OR IS THIS A PROBLEM WITH ONLT PYGTK

+1  A: 

Hello Ppl!!! I figured out how to draw on a text view !!!

To begin with lets assume the reference to your gtk.TextView is in a variable called viewer, Inside one of ur classes Also the draw function has to be called with an event called expose-event else the drawings will be refreshed and will not stay on the screen

The next part is the gtk.TextView consists of 7 types of gtk.gdk.windows on which u can draw gtk.TEXT_WINDOW_WIDGET

gtk.TEXT_WINDOW_TEXT

gtk.TEXT_WINDOW_LEFT - not displayed by default

gtk.TEXT_WINDOW_RIGHT - not displayed by default

gtk.TEXT_WINDOW_TOP - not displayed by default

gtk.TEXT_WINDOW_BOTTOM

gtk.TEXT_WINDOW_PRIVATE

For the drawing to appear on gtk.TextView We have to draw on gtk.TEXT_WINDOW_TEXT

An Example Code is as shown Below

if(viewer!=None):
viewer.connect("expose-event", expose_view) self.drawable=viewer.get_window(gtk.TEXT_WINDOW_TEXT)

def expose_view(self,window,event): if(self.drawable!=None):
self.drawable.draw_line(self.drawable.new_gc(),1,1,30,30) # (1,1) and (30,30) are the coordinates and u can give the values accordingly

Akash A
Although the code above has some minor problems, it worked for me as well. I'm not drawing lines (like lined paper) on the 'background'. See: http://code.google.com/p/key-train/source/browse/keytrain_textview.py
Scott Kirkwood
A: 

In a gtk.TextBuffer tags are used to set one or more pre-defined text attributes. Without subclassing, this is limited to the properties of a gtk.TextTag, and doesn't include anything akin to a border or outline property. There is no difference between PyGTK and plain GTK+ in this regard.

While somewhat hacky, the easiest way to do what you want to do is to connect to the expose-event of your gtk.TextView, get the coordinates of your string and draw on event.window, which is the gdk.Window of the event provided in the expose callback.

(Note that you don't have to get and store the gtk.TEXT_WINDOW_TEXT window, you just need to check what window the expose event is for in the callback, probably ignoring the expose if it's not for the text window.)

Instead, you could presumably subclass one or more of TextBuffer/TextView/TextTag to add a border tag, but whether it's reasonable to do so is another question.

Kai