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