Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2015 21:37:40

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Добрый день! Возник такой вопрос - в виджете 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)

Офлайн

#2 Май 11, 2015 22:24:12

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Вам интерпретатор написал, что 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)

Офлайн

#3 Май 12, 2015 14:46:19

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Спасибо за замечания.
А почему нужно отказываться от from Tkinter import *?

Офлайн

#4 Май 12, 2015 15:03:51

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Расписывал уже. Смотрим вот тут вот прямо…

Офлайн

#5 Май 12, 2015 15:08:58

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Понятно. Что-то такое я подозревал))

Отредактировано Babay (Май 13, 2015 11:50:12)

Офлайн

#6 Май 14, 2015 13:02:45

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Чегой-то у меня не получается передать vlist в функцию в обработчик trace - в документации на TK сказано о параметрах, которые автоматически передаются вызываемой функции, а как-что-то еще воткнуть - непонятно.
И еще такой вопрос - в функции on_field_change при обработке списка vlist он виден, а в конце функции при попытке присвоить vlist=tlist выкидывает ошибку. В чем здесь дело?

Отредактировано Babay (Май 14, 2015 13:08:18)

Офлайн

#7 Май 14, 2015 13:07:38

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

lambda

Офлайн

#8 Май 14, 2015 13:11:04

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Babay
И еще такой вопрос - в функции on_field_change при обработке списка vlist он виден, а в конце функции при попытке присвоить vlist=tlist выкидывает ошибку. В чем здесь дело?

Про пространство имен Вы читать принципиально не хотите?

Офлайн

#9 Май 14, 2015 13:13:21

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Возможно автору подойдет готовое решение.

Отредактировано ayb (Май 14, 2015 13:13:34)

Офлайн

#10 Май 14, 2015 13:17:30

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

изменение списка value в combobox по мере ввода текста

Вот-вот, lambda - вообще непонятная штука. Читаю - не понимаю про нее, опыта нет
Про пространство имен - получается, что в моем варианте vlst в функции определяется как локальная функция

Отредактировано Babay (Май 14, 2015 14:54:56)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version