Переместить полосу прокрутки Tkinter в определенный виджет - PullRequest
2 голосов
/ 19 января 2020

Я добавил некоторые функциональные возможности полосы прокрутки к своему Tkinter GUI примерно так:

self.canvas = tk.Canvas(self.baseframe)
self.scrollbar = tk.Scrollbar(self.baseframe, orient="vertical", command=self.canvas.yview)
self.scrollable = tk.Frame(self.canvas)
self.scrollable.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
self.canvas.create_window((0, 0), window=self.scrollable, anchor="n")
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.canvas.bind_all("<MouseWheel>", self._mousescroll)

Я определил _mousecroll() как

    def _mousescroll(self, event):
        """mouse wheel scroll callback"""
        # Divide the event.delta by some value to effect the scrolling speed
        self.canvas.yview_scroll(int(-1*(event.delta/120)), "units")

, что прекрасно работает.

Затем я добавляю несколько tkLabelFrame виджетов в область прокрутки (которые сами содержат виджеты, отображающие материал - не относится к этому вопросу). Вся функциональность прокрутки работает очень хорошо.

В другой части моего GUI я бы хотел, чтобы пользователь мог "прыгать" к определенной c точке в области прокрутки на кнопке. нажмите кнопку. По сути автоматически прокручивает область прокрутки до этой точки. Это возможно? У меня есть полный контроль над кодом GUI, так что я могу добавлять метки в список tkLabelFrames, сохранять их в каком-то списке / словаре, чтобы их можно было легко найти ... что-то вроде этого?

Примечание. Число tkLabelFrames, добавляемых в область прокрутки, равно Dynami c, поэтому какой-то абсолютный «переход на такое количество пикселей», вероятно, не будет работать. Я надеялся, что там может быть какой-то вид «прокрутки до виджета с этой функциональностью label / attribute et c ..». Любая помощь приветствуется. Спасибо.

1 Ответ

1 голос
/ 20 января 2020

Для моего конкретного сценария виджеты внутри прокручиваемой области имеют одинаковую высоту, поэтому я смог использовать простую дробь для прокрутки до нужного места.

Добавление кнопки с обратным вызовом для у меня такой метод работал:

def scrollto(self, idx):
    # Where self.frames is the list of tkLabelFrame objects.
    fraction = float(idx/len(self.frames))

    # self.canvas is my scrollable canvas
    self.canvas.yview_moveto(fraction)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...