如何在tkinter的TextWidget中获取当前单词

时间:2019-09-11 06:32:23

标签: python tkinter

假设我在TextField中设置了以下tkinter

import tkinter as tk

class TextField(object):
    def __init__(self, master, **kwargs):
        self.master = master

        s = tk.Scrollbar(master)
        text = tk.Text(master, height = 40, width = 100)
        s.pack(side = tk.RIGHT, fill = tk.Y)
        text.pack(side = tk.LEFT, fill = tk.Y)
        s.config(command=text.yview)
        text.config(yscrollcommand=s.set)

        text.insert(tk.END, "some string")
        text.bind('<Tab>', self.tabbed_text)

        self.text = text

    def tabbed_text(self, event):
        print(event)
        # now what to do here?

root=tk.Tk()
tf = TextField(root)
root.mainloop()

如何获取在[a-zA-Z0-9_]+函数中键入的当前“单词”(即tabbed_text())?最终目的是在点击Tab时具有某种自动文本功能。

3 个答案:

答案 0 :(得分:2)

您可以像这样使用self.text.get()函数。您可以根据需要修改get参数。希望对您有帮助。

class TextField(object):
    def __init__(self, master, **kwargs):
        self.master = master

        s = tk.Scrollbar(master)
        text = tk.Text(master, height = 40, width = 100)
        s.pack(side = tk.RIGHT, fill = tk.Y)
        text.pack(side = tk.LEFT, fill = tk.Y)
        s.config(command=text.yview)
        text.config(yscrollcommand=s.set)

        text.insert(tk.END, "some string")
        text.bind('<Tab>', self.tabbed_text)

        self.text = text

    def tabbed_text(self, event):
        print(event)
        text = self.text.get("1.0","end")
        self.text.insert(tk.END, text)

root=tk.Tk()
tf = TextField(root)
root.mainloop()

答案 1 :(得分:2)

文本小部件允许您将修饰符添加到索引以调整索引。这些修饰符是linestartlineendwordstartwordend。他们几乎听起来像他们一样。

因此,要根据插入光标("insert"的索引)获取单词,您可以这样操作:

word = event.widget.get("insert wordstart", "insert wordend")

您可能还希望事件处理程序返回字符串"break",以便不插入制表符:

def tabbed_text(self, event):
    word = event.widget.get("insert wordstart", "insert wordend")
    print("word:", word)
    return "break"

注意:如果光标位于单词的结尾,则不会将其视为单词。如果您想在光标前紧接单词,则可能需要使用insert -1c wordstart之类的东西。

答案 2 :(得分:0)

除了@Bryan's excellent answer外,我还需要一些用于换行符的附加功能。
这是我最终使用的代码(但可以接受更好的建议):

def tabbed_text(self, event):
    word = event.widget.get("insert -1c wordstart", "insert")
    print("word:", word)
    offset = "+1c" if word[0] == "\n" else ""
    word = word.strip()

    try:
        new_string = self.replacements[word]
        event.widget.delete(f"insert -1c wordstart {offset}", "insert")
        event.widget.insert("insert", new_string)
    except:
        pass

    return "break"