假设我在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时具有某种自动文本功能。
答案 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)
文本小部件允许您将修饰符添加到索引以调整索引。这些修饰符是linestart
,lineend
,wordstart
和wordend
。他们几乎听起来像他们一样。
因此,要根据插入光标("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"