如何在tkinter文本小部件中为文本的当前长度制作许多标签?



我想在tkinter Text小部件中为文本的当前长度制作标签但我的代码做最后一个文本框那我该怎么做呢?

from tkinter import *
win=Tk()
win.geometry("700x350")
text_all=[]
label_all=[]
for i in range(1,11):
text=Text(win, width=20, height=1, font=('Calibri 14'))
text.grid(row=i-1,column=0)
text_all.append(text)
label=Label(win, text="Total Characters", justify=CENTER, font=('11'))
label.grid(row=i-1, column=1)
label_all.append(label)
for i in range(1,11):
def update(event):
label_all[i-1].config(text="Total Characters: "+str(len(text_all[i-1].get("1.0", 'end-1c'))))

text_all[i-1].bind('<KeyPress>', update)
text_all[i-1].bind('<KeyRelease>', update)
win.mainloop()

当执行update()时,i的值将是for循环后的最后一个赋值,即10。

您需要捕获i所需的值,并使用参数将此值传递给update()默认值:

for i in range(1, 11):
def update(event, i=i):
label_all[i-1].config(text="Total Characters: "+str(len(text_all[i-1].get("1.0", 'end-1c'))))
...

也可以将两个for循环合并为一个:

for i in range(1,11):
def update(event, i=i):
label_all[i-1].config(text="Total Characters: "+str(len(text_all[i-1].get("1.0", 'end-1c'))))
text=Text(win, width=20, height=1, font=('Calibri 14'))
text.grid(row=i-1,column=0)
text.bind('<KeyPress>', update)
text.bind('<KeyRelease>', update)
text_all.append(text)
label=Label(win, text="Total Characters", justify=CENTER, font=('11'))
label.grid(row=i-1, column=1)
label_all.append(label)

我所要做的就是删除geometry语句,以便允许Text确定窗口大小并将update(event)更改为update(event, i = i):

一切正常!


from tkinter import *
win=Tk()
# remove and let text widget determine width of window
# win.geometry("700x350")
text_all=[]
label_all=[]
for i in range(1,11):
text=Text(win, width = 40, height=1, font=('Calibri 14'))
text.grid(row=i-1,column=0, sticky=EW)
text_all.append(text)
label=Label(win, text="Total Characters", justify=CENTER, font=('11'))
label.grid(row=i-1, column=1, sticky=EW)
label_all.append(label)
for i in range(1,11):
def update(event, i = i):
label_all[i-1].config(text="Total Characters: "+str(len(text_all[i-1].get("1.0", 'end-1c'))))

text_all[i-1].bind('<KeyPress>', update)
text_all[i-1].bind('<KeyRelease>', update)
win.mainloop()

最新更新