Tkinter как сохранить вставку на экране при использовании колеса мыши

#python #event-handling #tkinter #mouseevent #mousewheel

#python #обработка событий #tkinter #mouseevent #колесо мыши

Вопрос:

В Tkinter как сохранить вставку текста на экране (в текстовом виджете) при прокрутке текстового виджета с помощью колеса мыши?

Комментарии:

1. Если вам интересно, для чего нужны отрицательные голоса, они, вероятно, из-за недопонимания (они думали, что мой ответ был частью моего вопроса, и они думали, что он не отвечает на вопрос по какой-то неизвестной причине, но оба убеждения совершенно ложны).

Ответ №1:

Вот пример ответа на вопрос в коде. Это не часть вопроса. Это ответ. Я уверен, что есть больше способов ответить на этот вопрос (вот почему я написал ответ «пример»).

 from tkinter import *

…

def create_widgets(self):
    …
    self.textWidget.bind("<MouseWheel>", self.mouse_wheel) #Windows mouse wheel
    self.textWidget.bind("<Button-4>", self.mouse_wheel) #Linux mouse wheel
    self.textWidget.bind("<Button-5>", self.mouse_wheel) #Linux mouse wheel (one is for scrolling up and one is for scrolling down, in Linux)

def mouse_wheel(self, event):
    self.textWidget.mark_set(INSERT, "current display linestart") #display makes it uses display lines (as in when word wrap is on in case you have a line that spans a lot of 'display' lines)
    #Don't add return "break" here unless you want to write the entire mouse wheel functionality yourself.
  

Этот код используется mark_set для размещения вставки в "current display linestart" (которая является началом строки, где находится указатель мыши). mouse_wheel Метод вызывается при прокрутке колеса мыши. Это кроссплатформенное решение, поскольку оно предоставляет способ сделать это как в Linux, так и в других системах (например, Windows).

Комментарии:

1. Ответ на самом деле отвечает на вопрос и должен был ответить на вопрос. Единственная причина, по которой я задал вопрос, заключалась в том, чтобы ответить на него этим ответом (не потому, что мне нужно было знать). Ответ не является критикой. И это не разъяснение вопроса. Это работает и является проверенным кодом.

2. Я отредактировал ответ, чтобы сделать более очевидным, что код является ответом, а не частью вопроса, и объяснил, как он отвечает на вопрос позже.