Python 获取文本tkinter小部件的行数

Python 获取文本tkinter小部件的行数,python,widget,tkinter,Python,Widget,Tkinter,我得到tkinterText小部件的行数,如下所示: import Tkinter as Tk def countlines(event): print float(event.widget.index(Tk.END))-1 print event.widget.get("1.0", Tk.END).count("\n") root = Tk.Tk() root.geometry("200x200") a = Tk.Text(root) a.pack() a.bind("&

我得到tkinter
Text
小部件的行数,如下所示:

import Tkinter as Tk

def countlines(event):
    print float(event.widget.index(Tk.END))-1 
    print event.widget.get("1.0", Tk.END).count("\n")

root = Tk.Tk()
root.geometry("200x200")
a = Tk.Text(root)
a.pack()
a.bind("<Key>", countlines)

root.mainloop()
将Tkinter作为Tk导入
def计数线(事件):
打印浮点(event.widget.index(Tk.END))-1
打印event.widget.get(“1.0”,Tk.END).count(“\n”)
root=Tk.Tk()
根几何(“200x200”)
a=Tk.Text(根)
a、 包()
a、 绑定(“,计数行)
root.mainloop()
唯一的问题是:当你点击
,行数不会增加。为了增加行数,您需要添加更多的文本


如何使键增加行数?

不要获取所有文本然后进行计数,只需使用
索引(“end-1c”)
获取最后一个减号字符的索引,然后执行一些字符串操作以获取行号

至于数字为什么没有增加,是因为绑定发生在插入返回键之前。对于您的简单测试,您可以通过绑定
来解决这一问题,因为字符是在印刷机上插入的

import Tkinter as Tk

def countlines(event):
    (line, c) = map(int, event.widget.index("end-1c").split("."))
    print line, c

root = Tk.Tk()
root.geometry("200x200")
a = Tk.Text(root)
a.pack()
a.bind("<KeyRelease>", countlines)

root.mainloop()
将Tkinter作为Tk导入
def计数线(事件):
(行,c)=映射(int,event.widget.index(“end-1c”).split(“.”)
打印行,c
root=Tk.Tk()
根几何(“200x200”)
a=Tk.Text(根)
a、 包()
a、 绑定(“,计数行)
root.mainloop()
如果需要在按键时打印值,则必须使用名为“bindtags”的高级功能。Bindtags在对该问题的回答中简要介绍:。简而言之,您必须创建一个出现在类bindtag之后的自定义bindtag,以便绑定发生在类绑定之后

以下是如何修改程序以使用bindtags:

import Tkinter as Tk

def countlines(event):
    (line, c) = map(int, event.widget.index("end-1c").split("."))
    print line, c

root = Tk.Tk()
root.geometry("200x200")
a = Tk.Text(root)
a.pack()
bindtags = list(a.bindtags())
bindtags.insert(2, "custom")
a.bindtags(tuple(bindtags))
a.bind_class("custom", "<Key>", countlines)

root.mainloop()
将Tkinter作为Tk导入
def计数线(事件):
(行,c)=映射(int,event.widget.index(“end-1c”).split(“.”)
打印行,c
root=Tk.Tk()
根几何(“200x200”)
a=Tk.Text(根)
a、 包()
bindtags=列表(a.bindtags())
bindtags.插入(2,“自定义”)
a、 bindtags(元组(bindtags))
a、 绑定类(“自定义”、“计数行”)
root.mainloop()

谢谢!当按键时(而不是松开时,因为有时您会长时间按住按键),是否可以获取计数?@Basj:如果你按住键的时间足够长,它将开始重复并添加多个字符——因此很明显,你会希望等到它被释放。不@martineau,因为我需要实时更新显示(取决于行的实时计数),谢谢@BryanOakley!它起作用了!(但我不明白索引(“end-1c”);)这是什么“end-1c”?为什么要用“.”分开呢?为什么是这个字符?)文本小部件总是在末尾添加一个额外的换行符,这是您不想计算的。这就是为什么“end-1c”。因为
.index()
返回一个“line.column”形式的字符串(例如:
1.0
2.14
,等等)