如何获取 Tkinter 文本小部件中文本的当前长度

How do I get the current length of the Text in a Tkinter Text widget

我正在编写一个轻型 webtexting 应用程序,我正在尝试在用于编写要在 webtext 中发送的消息的 TKinter 文本小部件中显示当前字符数。我现在的代码可以在下面看到,我正在使用 python

root = Tk()

msgLabel = Label(text="Message")
msgLabel.grid(row=0, column=0)
msg = Text(width=40, height=4, wrap="word")
msg.grid(row=0, column=1, padx=10, pady=5)

#Try to display number of characters within message to user
charCount = Label(text="Character Count: "+str(len(meg.get("1.0", 'end-1c')))
charCount.grid(row=1, column=1, pady=5, padx=5)

root.mainloop()

我希望能够显示用户所写消息中的字符数,因为每个网页文本有 160 个字符的限制。是否可以显示当前字符长度,随着文本的插入和删除而更新?提前致谢

我们使用StringVar 将新文本设置为标签。 我们需要为按键绑定msg

from Tkinter import *
root = Tk()

def update(event):
    var.set(str(len(msg.get("1.0", 'end-1c'))))

msgLabel = Label(text="Message")
msgLabel.grid(row=0, column=0)
msg = Text(width=40, height=4, wrap="word")
msg.grid(row=0, column=1, padx=10, pady=5)

var = StringVar()

#Try to display number of characters within message to user
charCount = Label(textvariable=var)
charCount.grid(row=1, column=1, pady=5, padx=5)

msg.bind("<KeyRelease>", update)

root.mainloop()

在下面的示例中,text 中的字符数始终显示在上面的 label 中。

try:
    import tkinter as tk
except:
    import Tkinter as tk


def on_every_keyboard_input(event):
    update_char_length(text, label)


def update_char_length(text_widget, display_widget):
    string_in_text = text_widget.get('1.0', 'end-1c')
    string_length = len(string_in_text)
    display_widget['text'] = string_length


if __name__ == '__main__':
    root = tk.Tk()
    text = tk.Text(root)
    label = tk.Label(root, text=0, justify='center')

    text.bind('<KeyPress>', on_every_keyboard_input)
    text.bind('<KeyRelease>', on_every_keyboard_input)

    label.pack()
    text.pack()
    root.mainloop()

下面是一个小例子,其中 text 中的字符数始终显示在上面的 label 中。

try:
    import tkinter as tk
except:
    import Tkinter as tk


if __name__ == '__main__':
    def update(event):
        label['text'] = len(text.get('1.0', 'end-1c'))


    root = tk.Tk()
    text = tk.Text(root)
    label = tk.Label(root, text=0, justify='center')

    text.bind('<KeyPress>', update)
    text.bind('<KeyRelease>', update)

    label.pack()
    text.pack()
    root.mainloop()

下面的脚本定义了一个class,TextWithCharLength,其中有一个Text和一个Label,其中[=14=中内容的字符长度] 显示:

try:
    import tkinter as tk
except:
    import Tkinter as tk


class TextWithCharLength(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self._events = ('<KeyPress>',
                        '<KeyRelease>',
                        '<ButtonRelease-1>',
                        '<ButtonRelease-2>',
                        '<ButtonRelease-3>',
                        '<Delete>',
                        '<<Cut>>',
                        '<<Paste>>',
                        '<<Undo>>',
                        '<<Redo>>')
        self._create_widgets()
        self._widgets_layout()
        self.update_char_len(event=None)
        self.bind_events_on_widget_to_callback( self._events,
                                                self.text,
                                                self.update_char_len)

    def _create_widgets(self):
        self.label = tk.Label(self, justify='center')
        self.text = tk.Text(self)


    def _widgets_layout(self):
        self.label.pack(fill='x', expand=True)
        self.text.pack(fill='both', expand=True)


    @staticmethod
    def bind_events_on_widget_to_callback(events, widget, callback):
        """ Bind events on widget to callback.
        """

        for _event in events:
            widget.bind(_event, callback)


    def update_char_len(self, event):
        """ Update self.label's text with character length of content
        in self.text.
        """

        self.label['text'] = len(self.text.get('1.0', 'end-1c'))


if __name__ == '__main__':
    root = tk.Tk()
    text_frame = TextWithCharLength(root)
    text_frame.pack()
    root.mainloop()