Остановить прокрутку текстового виджета при изменении содержимого - PullRequest
3 голосов
/ 16 января 2011

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

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 ]

2 голосов
/ 26 января 2011

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

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

if self.myWidgetScrollbar.get() == 1.0:
    self.myWidget.yview(END)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...