Форум сайта python.su
Здравствуйте. Есть код, приложенный ниже, в котором определены сигналы для toggle-кнопок в количестве 4 штук.
По нажатию кнопки revealer разворачивает контейнер с элементами, разный в зависимости от нажатой кнопки.
Есть два вопроса, в решении которых документация мне не помогла, гугл тоже (хотя мастерством гуления я не похвастаюсь).
1. Есть ли возможность сократить код? ведь алгоритм аналогичен во всех 4 случаях.
2. Как можно грамотно организовать отжатие одного тоггла при нажатии другого, чтобы revealer нового тоггла разворачивался, а отжатого сворачивался? Код получается кривой, мои решения меня совершенно не порадовали.
И еще смежный вопрос, в котором не разобрался - может, кто подскажет: после сворачивания revealer, размер окна не возвращается к начальному (до разворачивания контейнера). Как это пофиксить?
По сему прошу помощи.
P.S. Интерфейс собран в глэйде и достаточно емок.
def on_Button1_toggled(self, widget): if self.revealer1.get_reveal_child(): self.revealer1.set_reveal_child(False) else: self.revealer1.set_reveal_child(True) def on_Button2_toggled(self, widget): if self.revealer2.get_reveal_child(): self.revealer2.set_reveal_child(False) else: self.revealer2.set_reveal_child(True) def on_Button3_toggled(self, widget): if self.revealer3.get_reveal_child(): self.revealer3.set_reveal_child(False) else: self.revealer3.set_reveal_child(True) def on_Button4_toggled(self, widget): if self.revealer4.get_reveal_child(): self.revealer4.set_reveal_child(False) else: self.revealer4.set_reveal_child(True)
Офлайн
У меня в голове родился вот такой план. Возьмем например два списка:
self.revealers = [self.revealer1, self.revealer2, self.revealer3, self.revealer4]
self.buttons = [self.button1, self.button2, self.button3, self.button4]
Инициализируем переменную, которая будет содержать индекс нажатой кнопки:
self.toggled = None
и для всех кнопок коннектим один и тот же код:
def on_toggled(self, widget):
if self.toggled is not None:
self.revealers[self.toggled].set_reveal_child(False)
self.buttons[self.toggled].set_active(False)
index = self.buttons.index(widget)
self.toggled = index
self.revealers[self.toggled].set_reveal_child(True)
вот как то так получается. Если что не так поправляйте.
Отредактировано b_oss (Авг. 5, 2015 18:26:37)
Офлайн
b_oss
вот как то так получается. Если что не так поправляйте.
Офлайн
Если я правильно понимаю, нужно отлавливать отдельно нажатие и отжатие кнопки. И при этом нажато не более одной кнопки. Тогда можно код дополнить так:
def on_toggled(self, widget):
index = self.buttons.index(widget)
# Кнопка нажата
if widget.get_active():
if self.toggled is not None:
self.revealers[self.toggled].set_reveal_child(False)
self.buttons[self.toggled].set_active(False)
self.toggled = index
self.revealers[self.toggled].set_reveal_child(True)
# Кнопка отжата
else:
# Прячем revealer
self.revealers[index].set_reveal_child(False)
# Нет нажатой кнопки
self.toggled = None
Офлайн
Я пытался сделать примерно так же - работоспособность никакая. Четко по вашему коду почему-то не отрабатывает блок else. Не вполне понимаю, почему так выходит. То есть кнопка не отжимается, ревилер не сворачивается.
Офлайн
Ну тогда не знаю... отладку приложения нужно делать, смотреть пошагово что происходит во время отжатия кнопки.
Офлайн
Итого, если кому интересно, привел код в рабочее состояние. Тему считать закрытой. Спасибо b_oss за помощь!
Если кто предложит исправления/улучшения - это только приветствуется.
Суть работы: есть 4 toggle-button. Если нажимаем на один - разворачивается соответствующий ревилер с куском интерфеса. Нажимаем другую кнопку - разворачивается другой ревилер вместо первого. В итоге только одна кнопка может быть нажата, ей соответствующий ревилер развернут - все остальное отжато и свернуто. Ничего не нажато - ничего не развернуто.
Конечный код ниже:
def on_toggled(self, widget): self.revealers = [self.revealer1, self.revealer2, self.revealer3, self.revealer4] self.buttons = [self.button1, self.button2, self.button3, self.button4] index = self.buttons.index(widget) # Кнопка нажата if widget.get_active(): # Показываем ревилер self.revealers[index].set_reveal_child(True) # Создаем список неактивных элементов: inactive_revealers=self.revealers del inactive_revealers[index] for each in inactive_revealers: #деактивируем each.set_reveal_child(False) inactive_buttons=self.buttons del inactive_buttons[index] for each in inactive_buttons: #деактивируем each.set_active(False) # Возвращаем исходный размер окна (при старте окна получаем от билдера self.defsize) self.window.resize(self.defsize[0], self.defsize[1]) # Кнопка отжата else: # Прячем revealer self.revealers[index].set_reveal_child(False) # Возвращаем исходный размер окна (при старте окна получаем от билдера self.defsize) self.window.resize(self.defsize[0], self.defsize[1])
Отредактировано sergeich1992 (Авг. 26, 2015 16:25:04)
Офлайн