Я запускаю простой диалог из консольного скрипта, чтобы показать список элементов, который должен быть закрыт, когда элемент списка дважды щелкнут. Я скрываю корень и жду, когда действие будет продолжено с помощью скрипта. Тем не менее, ничего не происходит, когда я дважды нажимаю элементы списка, несмотря на то, что некоторые сообщения должны печататься на консоли.Tkinker listbox bind не работает
import Tkinter as tk
class SelectionList:
def __init__(self, list_of_options):
root = tk.Tk()
self.top = tk.Toplevel(root)
root.withdraw()
self.selection = None
self.initialize(list_of_options)
root.wait_window(self.top)
def initialize(self, list_of_options):
frame = tk.LabelFrame(self.top, text='Select an option')
frame.grid(
row=0, columnspan=1, sticky='W', padx=5, pady=5, ipadx=5, ipady=5)
self.listbox = tk.Listbox(self.top, width=25, height=10)
self.listbox.grid(row=0, column=0, sticky='E', padx=5, pady=2)
for opt in list_of_options:
self.listbox.insert(tk.END, opt)
self.listbox.bind('<Double-1>', self.selection)
def selection(self):
print 'Hello world'
self.selection = self.listbox.get(self.listbox.curselection()[0])
print self.selection
self.quit()
Есть идеи?
EDIT: На основании ответа Гилла, я отредактировал мой код:
- Теперь метод называется _get_selection, чтобы избежать конфликтов с переменной self.selection. Метод также получает событие, даже если я его не использую
- Я вызываю mainloop и удаляю Toplevel. Класс теперь наследуется от Tkinker.Tk, поэтому он имеет метод quit.
Тем не менее, он все еще не работает. Появится диалоговое окно, но при двойном щелчке (даже при ошибке) ничего не печатается на консоли. Что мне не хватает?
Код:
import Tkinter as tk
class SelectionList(tk.Tk):
def __init__(self, list_of_options):
tk.Tk.__init__(self, None)
self.title('Select an option')
self.selection = None
self.initialize(list_of_options)
def initialize(self, list_of_options):
frame = tk.LabelFrame(self, text='Select an option')
frame.grid(
row=0, columnspan=1, sticky='W', padx=5, pady=5, ipadx=5, ipady=5)
self.listbox = tk.Listbox(self, width=25, height=10)
self.listbox.grid(row=0, column=0, sticky='E', padx=5, pady=2)
for opt in list_of_options:
self.listbox.insert(tk.END, opt)
self.listbox.bind('<Double-1>', lambda ev: self._get_selection)
def _get_selection(self, event):
print 'Hello world'
self.selection = self.listbox.get(self.listbox.curselection())
print self.selection
self.quit()
if __name__ == '__main__':
list_of_options = ['a', 'b', 'c', 'd']
dialog = SelectionList(list_of_options)
dialog.mainloop()
print 'Selected: ' + str(dialog.selection)
Существует что-то не так с отступом вашего кода. –
Где код 'self.quit()'? – mshildt
Вы не вызываете 'mainloop()'. –