Остановить прокрутку текстового виджета при изменении содержимого

У меня есть текстовый виджет с полосой прокрутки, которая выглядит примерно так:

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 ответа

Решение

Вы можете сохранить положение и восстановить его после обновления, как это делает код 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(), может быть, для принудительного поиска, но он работает.

Вы можете перейти к нижней части виджета после каждого обновления, используя метод yview текстового виджета. Кроме того, чтобы предотвратить расстраивание пользователей при переходе при прокрутке, вы можете выполнить простую проверку, чтобы убедиться, что полоса прокрутки уже находится внизу (иначе говоря, пользователь не прокручивает).

if self.myWidgetScrollbar.get() == 1.0:
    self.myWidget.yview(END)
Другие вопросы по тегам