Tkinter文本小部件向所选文本添加标签

时间:2017-03-31 13:11:52

标签: python python-3.x text tkinter textbox

我正在尝试使用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

此代码有效,但如果所选文本多次出现在文本框中,则会为所选代码的每个实例添加选项卡。有没有办法解决这个问题,可能涉及找到所选文本的位置。任何帮助将不胜感激。

1 个答案:

答案 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"