更改内容时停止滚动文本窗口小部件

时间:2011-01-16 06:37:36

标签: python scrollbar tkinter

我有一个带滚动条的文本小部件,如下所示:

self.myWidget = Text(root) 
self.myWidget.configure(state=DISABLED)
self.myWidget.pack()

self.myWidgetScrollbar = Scrollbar(root, command=self.myWidget.yview)
self.myWidget.configure(yscrollcommand=self.myWidgetScrollbar.set)
self.myWidgetScrollbar.pack(side=LEFT,fill=Y)

文本小部件每秒更新4次:

self.myWidget.configure(state=NORMAL)
self.myWidget.delete(1.0, END) 
self.myWidget.insert(END, "\n".join(self.listWithStuff))  
self.myWidget.configure(state=DISABLED)

问题在于,当我尝试滚动时,它会一直向上滚动到顶部(可能是每秒4次)。我认为这是因为所有内容都被删除了。

如何防止它自动滚动,或者在内容发生变化时可以“回滚”?

2 个答案:

答案 0 :(得分:2)

您可以保证位置并在更新后将其设置回来,就像这个Tcl代码那样:

proc update_view {w s data} {
  # store position
  set pos [$s get]
  $w configure -state normal -yscrollcommand {}
  $w delete 1.0 end
  $w insert end $data
  $w configure -state disabled -yscrollcommand [list $s set]
  $s get
  $s set {*}$pos
}

Tkinter代码看起来很相似,如:

def update_view(self, data):
    pos = self.myWidgetScrollbar.get()
    self.myWidget.configure(yscrollcommand=None, state=NORMAL)
    self.myWidget.delete(1.0, END)
    self.myWidget.insert(END, data)
    self.myWidget.configure(yscrollcommand=self.myWidgetScrollbar.set, state=DISABLED)
    self.myWidgetScrollbar.get()
    self.myWidgetScrollbar.set(pos)

不确定为什么需要中间的get(),可能强制进行一些查找,但是它可以工作。

答案 1 :(得分:1)

使用Text小部件的 yview 方法,您可以在每次更新后跳转到小部件的底部。此外,为了防止用户在尝试滚动时而让用户感到沮丧,您可以进行简单检查以确保滚动条已经位于底部( aka 用户isn滚动)。

if self.myWidgetScrollbar.get() == 1.0:
    self.myWidget.yview(END)