ZCGCoder
ZCGCoder

Reputation: 508

Problem with tkinter text insert wordstart

I tried to get the current word in a tkinter text widget. Here’s my code:

import tkinter as tk

win = tk.Tk()

text = tk.Text(win)
text.insert('end', 'a b abc')
text.pack(fill='both', expand=1)
def get_word():
    global text
    print(repr(text.get('insert -1c wordstart', 'insert wordend')))

tk.Button(win, text='Get Word', command=get_word).pack()

win.mainloop()

When:

I want to get the word right before the cursor, like when the cursor is after ‘b’, I want it to return ‘b’; return ‘abc’ when the cursor is after ‘abc’.

So how can I do this? Thanks for any ideas!

Upvotes: 2

Views: 327

Answers (2)

TheLizzard
TheLizzard

Reputation: 7680

Try this:

import tkinter as tk

win = tk.Tk()

text = tk.Text(win)
text.insert("end", "a b abc")
text.pack()

def get_word(event=None):
    word = text.get("insert wordstart", "insert wordend")
    if word in " \n":
        word = text.get("insert -1c wordstart", "insert -1c wordend")
    print(repr(word))

text.bind("<ButtonRelease-1>", get_word)
# If you want to test it using the arrow keys:
text.bind("<KeyRelease-Left>", get_word)
text.bind("<KeyRelease-Right>", get_word)

win.mainloop()

I just combined your solution with @Khaled's solution. It first checks if @Khaled's solution works. If it doesn't, it checks your solution.

Upvotes: 1

KMG
KMG

Reputation: 1501

I hope this answer is what you want since you didn't clear out what exactly you want. Remove the -1c in index_1 parameter to solve the extra space added to word retrieved and extra newlines.

import tkinter as tk

win = tk.Tk()

text = tk.Text(win)
text.insert('end', 'a b abc')
text.pack(fill='both', expand=1)
def get_word():
    global text
    print(repr(text.get('insert wordstart', 'insert wordend')))

tk.Button(win, text='Get Word', command=get_word).pack()

win.mainloop()

this way if cursor is after a a single space is returned and if before a an a is returned with no extra spaces. also no new lines are appended to abc.

Upvotes: 2

Related Questions