tkinter:从第一个字符获取文本框中所选文本的索引

时间:2016-02-10 18:18:24

标签: python tkinter

如何从字符串中的第一个字符获取所选文本的位置。当我做的时候

 ind = textwidget.index("self.first")

我只将索引作为line.column。我想要的是从第一个角色开始的字符数。这样做的动机是我不必打扰在UI中进行格式化的方式,这会导致行数(与字符串中的换行符一起)。

有可能吗?

2 个答案:

答案 0 :(得分:3)

文本小部件有一个名为count的方法,它将为您提供两个位置之间字符数的计数。这个方法适用于python3,但不适用于python2。但是,对python2有一个简单的修复。

对于python3,要获取窗口小部件的开头和第一个选定字符之间的字符数,您可以执行以下操作:

count = textwidget.count("1.0", "sel.first")

对于python2,您必须调用底层的tcl解释器,因为该方法未被文本小部件公开。假设您的根小部件名为root,您可以这样做:

count = root.call(textwidget, "count", "1.0", "sel.first")

count方法有很多选择。例如,您可以计算像素数,可以包含或排除隐藏线等。有关底层tcl / tk引擎支持的最终选项列表,请参阅http://tcl.tk/man/tcl8.5/TkCmd/text.htm#M72

答案 1 :(得分:1)

我假设'第一个字符'表示文本中的第一个字符,索引为“1.0”,否则索引列将是您的答案。如果是这样,那么您必须对前一行中的字符数求和,并添加索引中的列。

import tkinter as tk
root = tk.Tk()
t = tk.Text(root)
t.insert('1.0', 'abcxyz\n')
t.insert('2.0', 'def\n')
t.insert('3.0', 'ghik\n')
# line, column = map(int, t.index('sel.first').split('.'))
line, column = 3, 2  # simulate 'i' beginning selection
column += sum(int(t.index('%d.end' % i).split('.')[1])
              for i in range(1, line))
column += (line - 1)  # to count \n's
print(column)

按预期打印13。你也可以得到前面的文本,让python总和。如果在line, column = ...之后插入,也会打印13。

s = t.get('1.0', '%d.%d' % (line, column))
print(s, len(s))