как заставить несколько списков прокручиваться с помощью клавиш со стрелками

#python #tkinter #listbox

Вопрос:

Я хочу иметь возможность прокручивать 4 списка одновременно с помощью клавиш со стрелками так же, как они это делают по отдельности, когда курсор щелкает по каждому отдельному списку? Есть ли событие или команда, которые могут управлять этим так, как привязка к любой кнопке?

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

1. Я забыл упомянуть, что во всех списках есть одинаковое количество элементов.

2. Вы пробовали звонить .yview_scroll(<y_steps>, "units") по каждому списку? y_steps должно быть целое число.

3. Можно ли получить положение элемента, отображаемого в верхней части любого списка. Я уже придумал способ решить свою проблему, но мне просто нужно иметь возможность получить новую должность и установить все остальные на нее.

Ответ №1:

Вы можете привязать виртуальное событие <<ListboxSelect>> , чтобы синхронизировать представление 4 списков , как Up , Down , Control-Home и Control-End ключи изменят выбор списка, а также область просмотра.

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

Ниже приведен пример:

 import tkinter as tk

def on_selection_changed(event):
    pos = event.widget.yview()[0] # get current view region of selected listbox
    selected = event.widget.curselection()
    # sync other listboxes
    for lb in listboxes:
        if lb is not event.widget:
            # update view region
            lb.yview_moveto(pos)
            if selected:
                # update selection
                lb.selection_clear(0, 'end')
                lb.selection_set(selected)

def on_scroll(event):
    # use after() to make sure the scrolling has been done by default handler
    # before synchronize those listboxes
    event.widget.after(0, on_selection_changed, event)

root = tk.Tk()

listboxes = []
for i in range(4):
    lb = tk.Listbox(root, width=20, exportselection=0, activestyle='none')
    lb.pack(side='left')
    lb.bind('<<ListboxSelect>>', on_selection_changed)
    lb.bind('<Prior>', on_scroll) # PgUp
    lb.bind('<Next>', on_scroll)  # PgDn
    lb.bind('<MouseWheel>', on_scroll)
    listboxes.append(lb)
    # insert dummy items
    for j in range(30):
        lb.insert('end', f'Item #{i 1}.{j 1:02}')

root.mainloop()
 

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

1. Я некоторое время смотрел на это, пытаясь понять, но я не уверен, как добавить 4 списка, которые у меня есть, в это, так как вы сделали свой, я думаю, что это те же имена.

2. @neo_codex Вам просто нужно понять, какие события должны быть привязаны к этим спискам и что нужно сделать внутри этих обратных вызовов. Затем вы можете применить логику к своему собственному коду.