У меня проблемы с получением привязки события для работы с python / tkinter. Я просто пытаюсь щелкнуть и напечатать местоположение, но каждый раз, когда я делаю это, "-1" - результат.

Вот мой код

from Tkinter import *
import Tkinter

class make_list(Tkinter.Listbox):

    def __init__(self,master, **kw):
        frame = Frame(master)
        frame.pack()
        self.build_main_window(frame)

        kw['selectmode'] = Tkinter.SINGLE
        Tkinter.Listbox.__init__(self, master, kw)
        master.bind('<Button-1>', self.click_button)
        master.curIndex = None

    #display the clicked location
    def click_button(self, event):
        self.curIndex = self.nearest(event.x)
        print self.curIndex

    #display the window, calls the listbox
    def build_main_window(self, frame):
        self.build_listbox(frame)

    #listbox
    def build_listbox(self, frame):
        listbox = Listbox(frame)
        for item in ["one", "two", "three", "four"]:
            listbox.insert(END, item)    
        listbox.insert(END, "a list entry")
        listbox.pack()
        return

if __name__ == '__main__':
    tk = Tkinter.Tk()
    make_list(tk)
    tk.mainloop()

обновленный код - я избавился от фрейма, но не могу понять, почему я получаю -1 для первого оператора печати в функции click_button

from Tkinter import *
import Tkinter

class make_list(Tkinter.Listbox):

    #display the clicked location
    def click_button(self, event):
        ##this block works
        w = event.widget
        index = int(w.curselection()[0])
        value = w.get(index)
        print value
        ##this doesn't
        self.curIndex = self.nearest(event.y)
        print self.curIndex
        self.curIndex = event.widget.nearest(event.y)
        print self.curIndex

    #display the window, calls the listbox
    def build_main_window(self):
        self.build_listbox()

    #listbox
    def build_listbox(self):
        listbox = Listbox()
        listbox.bind('<<ListboxSelect>>', self.click_button)
        for item in ["one", "two", "three", "four"]:
            listbox.insert(END, item)    
        listbox.insert(END, "a list entry")
        listbox.pack()
        return

if __name__ == '__main__':
    tk = Tkinter.Tk()
    start = make_list(tk)
    start.build_main_window()
    start.mainloop()
0
user1104854 23 Янв 2013 в 00:41

2 ответа

Лучший ответ

listbox ближайший элемент найден y, а не x.

 self.nearest(event.x)     # wrong
 self.nearest(event.y)     # right

Обновление: сначала я не заметил реальной проблемы:

    listbox = Listbox(frame)

Это не тот список, который вы вложили в подклассы, это еще один не связанный список. Ваш список (который равен make_list) пуст, поэтому он всегда возвращает -1 для ближайшего.

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

Быстрый способ узнать, как это будет работать после исправления, - вызвать nearest реального списка с event.widget:

self.curIndex = event.widget.nearest(event.y)
1
Anton Kovalenko 22 Янв 2013 в 21:01

В комментариях к ответу вы просите о лучшей практике. Лучше всего связываться с <<ListboxSelect>>, который будет срабатывать сразу после выбора элемента в списке.

Этот ответ на похожий вопрос имеет пример.

6
Community 23 Май 2017 в 11:46