【问题标题】:autoscroll of text and scrollbar in python text boxpython文本框中文本和滚动条的自动滚动
【发布时间】:2015-08-20 13:13:04
【问题描述】:

我的 tkinter 'Text' 和 'Scrollbar' 工作正常。在我的程序中,文本窗口会自动添加行。因此,当插入新的文本行并且数据超出限制时,我希望文本和滚动条自动滚动到底部,以便始终显示最新的文本行。这个怎么做?

还有如何链接文本窗口的滚动和滚动条,因为当我滚动文本窗口时不会发生滚动。我观察到的唯一方法是拖动滚动条。

    scrollbar = Tkinter.Scrollbar(group4.interior())
    scrollbar.pack(side = 'right',fill='y')

    Details1 = Output()        
    outputwindow = Tkinter.Text(group4.interior(), yscrollcommand = scrollbar.set,wrap = "word",width = 200,font = "{Times new Roman} 9")
    outputwindow.pack( side = 'left',fill='y')
    scrollbar.config( command = outputwindow.yview )
    outputwindow.yview('end')
    outputwindow.config(yscrollcommand=scrollbar.set)
    outputwindow.insert('end',Details1)

在程序中函数 output() 会不断发送数据,应该滚动

提前致谢,

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    虽然非常有用,但以上述方式使用 Text.see(...) 违背了拥有滚动条的目的。最好在“0”处插入文本。而不是 tk.END。这样,它最初会自动滚动,但您可以将其向下拖动到任何地方并且它会停留在那里(同时随着更多文本的添加而更新其范围,但您看到的文本保持不变,直到您滚动到其他地方)。一旦您希望它再次自动滚动,您只需将滚动条一直滑回顶部即可。

    另一种解决方案(不会影响传入文本的流向)是添加一些额外的逻辑,例如复选框,然后每次更新 Text 时,在决定是否调用 Text 之前检查该复选框的状态.see(...)。

    不知道有没有更优雅的解决方案。

    【讨论】:

      【解决方案2】:

      您可以使用带有索引的see 使文本小部件滚动到任何位置。

      例如,要使小部件的最后一行可见,您可以使用索引"end"

      outputwindow.see("end")
      

      这是一个完整的工作示例:

      import time
      try:
          # python 2.x
          import Tkinter as tk
      except ImportError:
          # python 3.x
          import tkinter as tk
      
      class Example(tk.Frame):
          def __init__(self, *args, **kwargs):
              tk.Frame.__init__(self, *args, **kwargs)
      
              self.text = tk.Text(self, height=6, width=40)
              self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
              self.text.configure(yscrollcommand=self.vsb.set)
              self.vsb.pack(side="right", fill="y")
              self.text.pack(side="left", fill="both", expand=True)
      
              self.add_timestamp()
      
          def add_timestamp(self):
              self.text.insert("end", time.ctime() + "\n")
              self.text.see("end")
              self.after(1000, self.add_timestamp)
      
      if __name__ == "__main__":
          root =tk.Tk()
          frame = Example(root)
          frame.pack(fill="both", expand=True)
          root.mainloop()
      

      【讨论】:

      • 你好 Bryan Oakley,我能知道为什么我们必须使用函数 time.ctime() 并且每隔一秒就会发生滚动更新吗??
      • @DsArjun:你不必打电话给time.ctime()。这只是说明数据随时间变化的一种方式。您可以插入任何您想要的信息。这只是每秒调用add_timestamp。你可以调用任何你想要的函数或方法。
      • 自动滚动在我的代码中工作。非常感谢。但是我看到的另一个问题是,如果您将光标放在文本窗口的顶部并使用指针轮向上滚动,它不会向上滚动。唯一的办法就是往上拖。任何带有指针轮旋转的滚动功能方式?我还观察到如果状态被禁用,则滚动与指针轮旋转一起工作
      • 链接坏了,effbot已经离线很久了。
      • @WinEunuuchs2Unix:感谢您告诉我。我已经删除了链接。
      【解决方案3】:

      看看Text.see(...)方法。

      TextWidget.insert(tk.END, str(new_txt))
      TextWidget.see(tk.END)
      

      我使用此模式将(又名insert)文本new_txt 添加到我的输出窗口并将(see)滚动到底部(tk.END

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-19
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        相关资源
        最近更新 更多