Найти - Пользователи
Полная версия: PyGTK: перестроить интерфейс на лету
Начало » GUI » PyGTK: перестроить интерфейс на лету
1
zend
Здравствуйте.

Генерирую группу радио кнопок на основе списка.
Список представляет из себя:
self.data['formats'] = [...,
...,
{"angle": False,
"category": "pass",
"copys": 4,
"gray_frame": False,
"width": 37,
"height": 47,
"faceheight": 12,
"name": "Паспорт РФ",
"onlyface": True,
"oval": False,
"overheadheight": 5,
"paper": "10x15",
"print_photo": False,
"to_grayscale": False},
...,
...]
Генерирую группу радио кнопок следующим образом:
    # Формируем "список форматов"
# self.data - это свойство класа id_photo_base
group = None
for format in self.data['formats']:
self.format_radio = gtk.RadioButton(group, format['name'])
self.format_radio.show()
group = self.format_radio
Всё здорово. Всё работает так, как и задумывалось. Но возникла необходимость удалять некоторые из кнопок прямо на лету (некрасиво показывать пользователю изменённый интерфейс только после повторного открытия окна, надо сразу). Но ничего из этой затеи пока не выходит.
Скрыть один элемент (последний в списке) удаётся с помощью:
self.format_radio.hide()
И скрыть удаётся только его, видимо, потому что, после того, как вышеупомянутый цикл отработает self.format_radio будет ссылаться как раз на последний элемент списка.

Как осуществить задуманное? Как налету перестраивать графический интерфейс? Как налету добавлять и удалять радио кнопки?
Shecspi
У вас таким образом self.format_radio перезаписывается каждую итерацию цикла. Необходимо каждой кнопке дать уникальное название. Например, добавьте в self.data ещё один пункт - id (1, 2, 3, 4, 5 и т.д.). И в цикле создавайте кнопку следующим образом -
self.format_radio[format['id']] = gtk.RadioButton(group, format['name'])
Таким образом у каждой кнопки будет свой уникальный идентификатор и ими можно будет манипулировать.
zend
Идея хороша и проста, как всё гениальное.
Я поначалу (когда впервые изобретал этот цикл), что бы переменная self.format_radio не перезаписывалась каждую итерацию цикла пытался генерировать её налету, но выходили лишь костыли и, в результате, решил всё оставить так как есть. Идея использовать список мне даже не приходила в голову. Кстати предоженый вами код будет работать только если сгенерировать список self.format_radio (а теперь это будет список) заранее.
Вот набросал за пару минут не оптимизированный, но рабочий код:
    group = None
self.format_radio = [x for x in range(len(self.data['formats']))]
id = 0
for format in self.data['formats']:
self.format_radio[id] = gtk.RadioButton(group, format['name'])
self.format_radio[id].show()
group = self.format_radio[id]
id += 1
Проверил его. Да действительно удаётся обращаться к отдельным кнопкам:
    self.format_radio[0].hide()
self.format_radio[3].hide()
self.format_radio[4].hide()
self.format_radio[5].hide()
self.format_radio[6].hide()
self.format_radio[-1].hide()
self.format_radio[-2].hide()
self.format_radio[-3].hide()
Вышеприведённый код отрабатывает правильно, так как и ожидается :-)
Спасибо. Буду работать в этом направлении.
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