Форум сайта python.su
0
Добрый день! Возник такой вопрос - в виджете combobox нужно после ввода каждого символа удалять из списка значения, в которых уже введенный фрагмент текста отсутствует. Таким образом, можно ускорить (по моему мнению) выбор нужного элемента из списка (а при его отсутствии - дополнить его новым)
Я написал вот такой тестовый фрагмент, который выдает ошибку: local variable ‘vlist’ referenced before assignment
Причина - строчка vlist = tlist
#!/usr/bin/env python # -*- coding: utf-8 -*- from Tkinter import * from ttk import * vlist=[u"один", u"два", u"три", u"одиннадцать", u"двадцать", u"тридцать", u"тридцать три"] def on_field_change(index, value, op): tlist=[] f=unicode(c.get()) for text in vlist: if text.startswith(f): tlist.append (text) vlist=tlist root = Tk() v = StringVar() v.trace('w',on_field_change) c = Combobox(root, textvar=v, values=vlist) c.pack() mainloop()
Отредактировано Babay (Май 11, 2015 21:39:07)
Офлайн
39
Вам интерпретатор написал, что vlist не определена внутри функции. Тут есть 3 варианта:
1. Сделать ее глобальной. Для этого используется инструкция global (настоятельно не рекомендую).
2. Явно передать vlist в обработчик trace. Для этого придется использовать анонимную функцию lambda.
3. Переписать все в ООП-стиле.
Выбирайте любой понравившийся. И, по-возможности, прочитайте у М. Лутца про пространства имен.
P.S. Желательно еще глянуть, что такое PEP8 и никогда в будущем не использовать from Tkinter import *.
P.S.S. Вопросы по Tlinter все же лучше размещать в разделе GUI.
Отредактировано 4kpt_III (Май 11, 2015 22:54:46)
Офлайн
0
Спасибо за замечания.
А почему нужно отказываться от from Tkinter import *?
Офлайн
39
Расписывал уже. Смотрим вот тут вот прямо…
Офлайн
0
Понятно. Что-то такое я подозревал))
Отредактировано Babay (Май 13, 2015 11:50:12)
Офлайн
0
Чегой-то у меня не получается передать vlist в функцию в обработчик trace - в документации на TK сказано о параметрах, которые автоматически передаются вызываемой функции, а как-что-то еще воткнуть - непонятно.
И еще такой вопрос - в функции on_field_change при обработке списка vlist он виден, а в конце функции при попытке присвоить vlist=tlist выкидывает ошибку. В чем здесь дело?
Отредактировано Babay (Май 14, 2015 13:08:18)
Офлайн
39
lambda
Офлайн
39
Babay
И еще такой вопрос - в функции on_field_change при обработке списка vlist он виден, а в конце функции при попытке присвоить vlist=tlist выкидывает ошибку. В чем здесь дело?
Офлайн
24
Возможно автору подойдет готовое решение.
Отредактировано ayb (Май 14, 2015 13:13:34)
Офлайн
0
Вот-вот, lambda - вообще непонятная штука. Читаю - не понимаю про нее, опыта нет
Про пространство имен - получается, что в моем варианте vlst в функции определяется как локальная функция
Отредактировано Babay (Май 14, 2015 14:54:56)
Офлайн