Nano Hash - криптовалюты, майнинг, программирование

Получение обратного вызова при изменении выбора Tkinter Listbox?

Существует несколько способов получения обратных вызовов при изменении виджетов Text или Entry в Tkinter, но я не нашел ни одного для Listbox (это не помогает, поскольку большая часть документации по событиям, которую я могу найти, старая или неполная). Есть ли способ создать событие для этого?

02.07.2011


Ответы:


1

Вы можете привязаться к событию <<ListboxSelect>>. Это событие будет генерироваться всякий раз, когда изменяется выбор, независимо от того, изменяется ли он при нажатии кнопки, с помощью клавиатуры или любым другим способом.

Вот простой пример, который обновляет метку всякий раз, когда вы выбираете что-то из списка:

import tkinter as tk

root = tk.Tk()
label = tk.Label(root)
listbox = tk.Listbox(root)
label.pack(side="bottom", fill="x")
listbox.pack(side="top", fill="both", expand=True)

listbox.insert("end", "one", "two", "three", "four", "five")

def callback(event):
    selection = event.widget.curselection()
    if selection:
        index = selection[0]
        data = event.widget.get(index)
        label.configure(text=data)
    else:
        label.configure(text="")

listbox.bind("<<ListboxSelect>>", callback)

root.mainloop()

скриншот

Это событие упоминается в канонической справочной странице списка. Все предопределенные виртуальные события можно найти на справочной странице.

02.07.2011
  • Отлично, спасибо. Знаете, где я могу найти документацию обо всех пользовательских событиях, поддерживаемых виджетами? 03.07.2011
  • @RobotGymnast Попробуйте (справочные страницы Tcl/Tk)[tcl .tk/man/tcl8.5/TkCmd/event.htm#M41] (из ответа Билла ниже) 02.11.2013

  • 2

    У меня была проблема, что мне нужно было получить последний выбранный элемент в списке с selectmode=MULTIPLE. Если у кого-то еще такая же проблема, вот что я сделал:

    lastselectionList = []
    def onselect(evt):
        # Note here that Tkinter passes an event object to onselect()
        global lastselectionList
        w = evt.widget
        if lastselectionList: #if not empty
        #compare last selectionlist with new list and extract the difference
            changedSelection = set(lastselectionList).symmetric_difference(set(w.curselection()))
            lastselectionList = w.curselection()
        else:
        #if empty, assign current selection
            lastselectionList = w.curselection()
            changedSelection = w.curselection()
        #changedSelection should always be a set with only one entry, therefore we can convert it to a lst and extract first entry
        index = int(list(changedSelection)[0])
        value = w.get(index)
        tkinter.messagebox.showinfo("You selected ", value)
    listbox = tk.Listbox(frame,selectmode=tk.MULTIPLE)
    listbox.bind('<<ListboxSelect>>', onselect)
    listbox.pack()
    
    20.12.2017

    3
  • Незначительная точка, но это печатает только первую из выбранных записей. Если у вас несколько вариантов, попробуйте что-то вроде print 'You selected items: %s'%[w.get(int(i)) for i in w.curselection()] 02.11.2013
  • В Python 3.6.5 int(w.curselection()[0]) можно заменить на w.curselection()[0], поскольку он уже возвращает объект типа int. Обратите внимание, что я не пробовал это ни с какой другой версией Python. 04.06.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..