首页 > 解决方案 > 如何在 tkinter 文本小部件中为文本的当前长度制作多个标签

问题描述

我想在 tkinter Text 小部件中为 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()

标签: pythontkinter

解决方案


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)

推荐阅读