我正在尝试使用tkinter为python创建一个文本编辑器。当用户突出显示文本行并按Tab键时,我希望程序在所选文本的每一行前面添加一个选项卡,类似于Idle所做的。这是我到目前为止的功能:
self.TextBox.bind('<KeyPress-Tab>', self.tabtext)
def tabtext(self, e):
try:
untabbed = self.TextBox.selection_get() # get selected text
lines = untabbed.split('\n') # splits into a list of lines
tabbed = ''
for i in range(len(lines)):
lines[i] = ' ' + lines[i] # adds tabs to each line
tabbed = '\n'.join(lines) # joins list with newline character
old = self.TextBox.get("1.0", tk.END) # gets old text
new = old.replace(untabbed, tabbed) # replaces all instances of highlighted
# text with new text
self.TextBox.delete('1.0', tk.END) # deletes old text
self.TextBox.insert(tkinter.END, new) # adds new text
return 'break' # prevents it from deletion
except:
return
此代码有效,但如果所选文本多次出现在文本框中,则会为所选代码的每个实例添加选项卡。有没有办法解决这个问题,可能涉及找到所选文本的位置。任何帮助将不胜感激。
答案 0 :(得分:1)
您只需替换所选代码,而不是删除并重新插入所有文本。
第一步是获取选择行开头的索引:
index = self.TextBox.index("sel.first linestart")
接下来,删除选择中的所有行:
self.TextBox.delete("sel.first linestart", "sel.last lineend")
最后,插入新文本
self.TextBox.insert(index, tabbed)
但是,如果你所做的只是插入标签,则不需要删除和替换。您也可以为所选范围中的每一行插入一个选项卡。你所要做的就是遍历这些线。它看起来像这样:
def tabtext(self, e):
last = self.TextBox.index("sel.last linestart")
index = self.TextBox.index("sel.first linestart")
while self.TextBox.compare(index,"<=", last):
self.TextBox.insert(index, " ")
index = self.TextBox.index("%s + 1 line" % index)
return "break"