【问题标题】:How do I get the current length of the Text in a Tkinter Text widget如何获取 Tkinter Text 小部件中文本的当前长度
【发布时间】:2015-12-28 12:34:45
【问题描述】:

我正在编写一个轻量级的网络文本应用程序,并且我正在尝试在 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 个字符的限制。是否可以显示当前字符长度,随着文本的插入和删除而更新?在此先感谢

【问题讨论】:

    标签: python user-interface text tkinter widget


    【解决方案1】:

    我们使用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()
    

    【讨论】:

      【解决方案2】:

      在下面的例子中,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()
      

      【讨论】:

        【解决方案3】:

        下面是一个小例子,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()
        

        【讨论】:

          【解决方案4】:

          下面的脚本定义了一个类TextWithCharLength,它有一个Text和一个Label,其中显示了text中内容的字符长度:

          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()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-29
            • 2021-11-12
            • 2011-04-16
            相关资源
            最近更新 更多