pythontkinterindex-errortkinter-text

Tkinter problem while using the text widget


I have this code to make each text "clickleable", from the Text() widget that has tkinter. However, when I run the program and click over one text I get this error message witch each corresponding text line:

_tkinter.TclError: bad text index "This is the first string." _tkinter.TclError: bad text index "This is the second string." _tkinter.TclError: bad text index "This is the third string."

If anyone may now a way to solve the issue, I be forever grateful. Here is the complete code:

import tkinter as tk

def text_click(event):
    index = text_widget.tag_names(tk.CURRENT)[0]
    clicked_text = text_widget.get(index)
    print(clicked_text)

# Create the main window
window = tk.Tk()

# Create a Text widget
text_widget = tk.Text(window, wrap="word")
text_widget.pack()

# List of strings
texto = ["This is the first string.", "This is the second string.", "This is the third string."]

# Insert each string from the list
for string in texto:
    text_widget.insert(tk.END, string + "\n")

    # Apply a tag to each inserted string
    tag_start = f"{text_widget.index(tk.END)}-{len(string) - 1}c"
    tag_end = f"{text_widget.index(tk.END)}-1c"
    text_widget.tag_add(string, tag_start, tag_end)

    # Bind the click event to the tag
    text_widget.tag_bind(string, "<Button-1>", text_click)

# Make the text widget read-only
text_widget.configure(state="disabled")

# Start the tkinter event loop
window.mainloop()

I am expecting to print the text of each line when clicked over it.


Solution

  • You can modify your text_click function like this:

    def text_click(event):
        index = text_widget.index(tk.CURRENT)
        clicked_text = text_widget.get(index + " linestart", index + " lineend")
        print(clicked_text)
    

    This retrieves the index of the clicked text using text_widget.index(tk.CURRENT), then it uses that index to retrieve the actual text by adding the appropriate linestart and lineend modifiers to the index.