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

标签 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 次)。我认为这是因为所有内容都被删除了。

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

最佳答案

您可以保护位置并在更新后将其重新设置,就像下面的 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(),可能是为了强制进行一些查找,但它确实有效。

关于python - 内容更改时停止文本小部件滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4704165/

相关文章:

javascript - Angular 8 无法让子面板正确滚动到屏幕顶部

python - 使用 Pyinstaller 问题创建 Python Tkinter exe 文件

python - 永久添加目录到 PYTHONPATH?

python - 我得到一个 "TypeError: cannot unpack non-iterable int object"

java - 如何围绕框布局制作 JScrollpane

HTML 和 CSS 在(有时)可滚动的 div 的内部和外部对齐右对齐的元素

python - 如何在 python 中的类中引用 Tkinter 小部件

python - 如何在 Python 中显示系统通知?

Python 正则表达式负向前瞻 - 仅包含结果文本,而不包含整个文本

python - 连接到 IBM AS400 服务器进行数据库操作挂起