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

我有一个带有滚动条的文本小部件,看起来像这样:

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次).我认为这是因为所有内容都已删除.

如何防止它自动滚动,或者在内容更改后可能会向后滚动?

解决方法:

您可以保护位置并在更新后将其设置回去,就像下面的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(),也许可以强制进行一些查找,但是还是可以的.

上一篇:20200303-03 QML TableView(Qt5.12) 设置行/列表头


下一篇:使用svg让页面自适应浏览器大小,整体等比缩放