Найти - Пользователи
Полная версия: изменение списка value в combobox по мере ввода текста
Начало » Python для новичков » изменение списка value в combobox по мере ввода текста
1 2
Babay
Добрый день! Возник такой вопрос - в виджете 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()
В чем здесь может быть подвох?
4kpt_III
Вам интерпретатор написал, что vlist не определена внутри функции. Тут есть 3 варианта:
1. Сделать ее глобальной. Для этого используется инструкция global (настоятельно не рекомендую).
2. Явно передать vlist в обработчик trace. Для этого придется использовать анонимную функцию lambda.
3. Переписать все в ООП-стиле.

Выбирайте любой понравившийся. И, по-возможности, прочитайте у М. Лутца про пространства имен.

P.S. Желательно еще глянуть, что такое PEP8 и никогда в будущем не использовать from Tkinter import *.
P.S.S. Вопросы по Tlinter все же лучше размещать в разделе GUI.
Babay
Спасибо за замечания.
А почему нужно отказываться от from Tkinter import *?
4kpt_III
Расписывал уже. Смотрим вот тут вот прямо…
Babay
Понятно. Что-то такое я подозревал))
Babay
Чегой-то у меня не получается передать vlist в функцию в обработчик trace - в документации на TK сказано о параметрах, которые автоматически передаются вызываемой функции, а как-что-то еще воткнуть - непонятно.
И еще такой вопрос - в функции on_field_change при обработке списка vlist он виден, а в конце функции при попытке присвоить vlist=tlist выкидывает ошибку. В чем здесь дело?
4kpt_III
lambda
4kpt_III
Babay
И еще такой вопрос - в функции on_field_change при обработке списка vlist он виден, а в конце функции при попытке присвоить vlist=tlist выкидывает ошибку. В чем здесь дело?

Про пространство имен Вы читать принципиально не хотите?
ayb
Возможно автору подойдет готовое решение.
Babay
Вот-вот, lambda - вообще непонятная штука. Читаю - не понимаю про нее, опыта нет
Про пространство имен - получается, что в моем варианте vlst в функции определяется как локальная функция
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB