从文本中删除范围

时间:2017-11-20 21:03:28

标签: python user-interface tkinter tk

我正在尝试使用python tk库创建一个键盘。我正在运行Python 3.6.3版。

1)我的UI中有一个Text小部件。当我按退格按钮时,我想删除Text小部件中的最后一个字符。我也在保留Text小部件中字符总数的计数。

到目前为止,我已经尝试过:

 def back():
    global char_count # contains total char count
    text.delete(char_count)

我还尝试将最后一行调整为text.delete(char_count-1),认为索引计数可能是1(我不确定我的计数是否与Text小部件中的索引匹配)。上面的代码不会删除任何内容。

2)我还试图了解如何删除一系列文本。我已经在网上查了一下,我发现要删除整个文本内容,人们使用:

   text.delete("1.0", tk.END)

这样可行,但如果我尝试另一种方法从第二个索引中删除所有内容,如下所示:没有任何反应:

   text.delete("2.0", tk.END)

我想问一下从文本中删除最后一个字符或范围的正确方法是什么,假设要使用的索引是变量而不是硬编码,如" 2.0"上方。

1 个答案:

答案 0 :(得分:3)

1)Text小部件始终确保小部件中的最后一个字符是换行符,因此您可以删除所需的字符,倒数第二个字符,如下所示:

def back():
    text.delete('%s - 2c' % 'end')

无需跟踪“文本”小部件中的字符数。

完整的工作样本在这里:

import sys
if sys.version_info.major is 3:
    import tkinter as tk
else:
    import Tkinter as tk

def back():
    text.delete('%s - 2c' % tk.END)

root = tk.Tk()
text = tk.Text(root)
text.pack()
tk.Button(root, text='Delete', command = back).pack()
root.mainloop()

2)留意text.delete("2.0", tk.END)" 2.0" 是第二行的开头。 Text小部件的索引具有不同的格式,但最简单的是文本字符串' X.Y',其中X是行号(从1开始),Y是列该行的编号(从0开始)。并且列不会总是对齐,因为制表符会占用一列但在“文本”小部件中看起来要宽得多。

您可以使用变量调用delete()方法,例如text.delete(startIndex, stopIndex)。诀窍是确保索引有效。 ' 1.0'表示文本小部件中的第一个位置,并且'结束'代表最后一个。请查看http://effbot.org/tkinterbook/text.htm,了解Text小部件及其索引的工作原理。

有多种方法可以操作Text索引,但最常见的一些方法是使用text.index( arg )方法,它返回一个' X.Y'表示 arg ,以及nextpos = text.index('%s + 1 chars' % thispos)格式,它允许您对索引进行基本数学运算。在这种情况下,它会将 nextpos 设置为下一列。但是' + 1'可以是正或负的任何数字,以及'字符'可以是' line'或者'单词'。它有很多东西。但是看看那个effbot.org页面。