Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyGTK: перестроить интерфейс на лету [RSS Feed]

#1 Март 20, 2012 14:59:33

zend
От:
Зарегистрирован: 2012-03-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK: перестроить интерфейс на лету

Здравствуйте.

Генерирую группу радио кнопок на основе списка.
Список представляет из себя:

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 будет ссылаться как раз на последний элемент списка.

Как осуществить задуманное? Как налету перестраивать графический интерфейс? Как налету добавлять и удалять радио кнопки?



Офлайн

#2 Март 20, 2012 17:48:31

Shecspi
От:
Зарегистрирован: 2009-01-01
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK: перестроить интерфейс на лету

У вас таким образом self.format_radio перезаписывается каждую итерацию цикла. Необходимо каждой кнопке дать уникальное название. Например, добавьте в self.data ещё один пункт - id (1, 2, 3, 4, 5 и т.д.). И в цикле создавайте кнопку следующим образом -

self.format_radio[format['id']] = gtk.RadioButton(group, format['name'])
Таким образом у каждой кнопки будет свой уникальный идентификатор и ими можно будет манипулировать.



Офлайн

#3 Март 21, 2012 07:08:16

zend
От:
Зарегистрирован: 2012-03-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

PyGTK: перестроить интерфейс на лету

Идея хороша и проста, как всё гениальное.
Я поначалу (когда впервые изобретал этот цикл), что бы переменная 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()
Вышеприведённый код отрабатывает правильно, так как и ожидается :-)
Спасибо. Буду работать в этом направлении.



Офлайн

  • Начало
  • » GUI
  • » PyGTK: перестроить интерфейс на лету[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version