Thanks John and Lie,

This is supposed to color the word "red" red, "blue" blue, "green" green, etc... The idea is say for a database front end, the search words will be highlighted or colored when the query is returned. Another thing I want to try is a Program editor, something like IDLE. The program editor will be for Pic Basic Pro, (I mainly work with PIC CHIPS). Yes there is a couple of good editors for PBP in Windows but not Linux.
Yup, I have a long ways to go.  Got to start some place :)

I was doing the grid because that is how the example I read dealing with scrollbars worked. I stripped the scrollbar part out while working on the colors. So I need to look at the pack() method more.

I will work on this more tonight and I will not look at your code before I get something working.
Thanks again,
Dave



John Posner wrote:
On Thu, 31 Dec 2009 10:24:44 -0500, Dave McCormick <mackrac...@gmail.com>
wrote:

John,

Thank you for the tips.
I was changing the line-column index to a FLOAT because the search would return the starting position (pos) of the string, then by making it a FLOAT and adding the string length I was able to get the end position.
If "red" was on line 1 column 0..
          Tbox.tag_add("red", pos, float(pos)+.03)
       =
          Tbox.tag_add("red", 1.0, 1.3)
It was all I could come up with.

Yup, Dave, I've dug this kind of hole for myself many times!


You have convinced me about the re.finditer for this, I think... Still in the prototyping mode:

       def get_position(event):
                pos = Tbox.get(1.0, END)
match = [ matchobj.span() for matchobj in re.finditer("red", pos) ]
                print "match ",match  #debug to shell

Notes:

* Variable "pos" should be "text" or "complete_text" or something similar.

* The first argument to the get() function must be a string:

      wrong ... complete_text = Tbox.get(1.0, END)
      right ... complete_text = Tbox.get("1.0", END)

But there's a more important problem. Is this function supposed to handle *one* word to be colored red, or *all the words* to be colored red? Here's what you want to do on each user keystroke:

    1. Use get() to place the entire contents of the Text widget in a
variable, say "complete_text".

2. Use re.finditer() to generate START,END pairs for the substrings to be colored red. You might find it easier to create a list from the iterator, though it isn't really necessary:

     start_end_pairs = list(re.finditer("red", complete_text))

    3. Loop over the START,END pairs in this list. In each loop, use
tag_add() to tag one of the substrings.

[OOPS: I apologize if my suggestion in the previous post misled you. I described the output of finditer() as "a list of (start,end) pairs for an invocation of Text.tag_add()". I should have said "a list of (start,end) pairs, *WHICH CAN BE LOOPED OVER, FOR A SERIES OF INVOCATIONS* of Text.tag_add()".]

Note that the 3 steps above only handle the color red. So you want to place these steps in a function, then call the function for each color:

   insert_color_markup(text, "red")
   insert_color_markup(text, "green")
   insert_color_markup(text, "blue")

For each call, pass in the contents of complete_text as the first argument.

So the function-call hierarchy would be:

 get_position()                    <--- invoked on each keystroke
    insert_color_markup()          <--- called once for each color
       get() then finditer() then loop-driven calls to tag_add()

I hope that makes sense to you!


Gives all of START,END pairs just fine. It is the last hint about line-column indexes that I am have problems with. All of the documentation I can find about "text.tag_add()" uses line-column for coordinates.

Lie Ryan has already pointed you to clarifying documentation. Be sure to bookmark http://infohost.nmt.edu/tcc/help/pubs/tkinter/ in your Web browser!

If I count characters from the beginning how do I know what line the text is on? Would you mind making your last hint a bit stronger...

The point is that *you don't need to*. Handling the text as a simple sequence of characters is much simpler than worrying about line/column pairs. (If you were using a different shade of red on different lines, you *would* need to worry about line/column pairs.)

One more suggestion, which I forgot to make in the previous round. Your code includes this:

   Tbox.grid(column=0, row=0, sticky=(N+W+E+S))
   root.grid_columnconfigure(0, weight=1)
   root.grid_rowconfigure(0, weight=1)

You're working too hard here. This is sufficient:

   Tbox.pack()

Keep at it, Dave. I've posted a complete solution at http://cl1p.net/jjp_dynamic_text_color/. But I suggest that you put in a couple of more hours of coding before peeking at it.

Best,
John
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to