Форум сайта python.su
0
Здравствуйте. Есть код, приложенный ниже, в котором определены сигналы для 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)
Офлайн
1
У меня в голове родился вот такой план. Возьмем например два списка:
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)
Офлайн
0
b_oss
вот как то так получается. Если что не так поправляйте.
Офлайн
1
Если я правильно понимаю, нужно отлавливать отдельно нажатие и отжатие кнопки. И при этом нажато не более одной кнопки. Тогда можно код дополнить так:
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
Офлайн
0
Я пытался сделать примерно так же - работоспособность никакая. Четко по вашему коду почему-то не отрабатывает блок else. Не вполне понимаю, почему так выходит. То есть кнопка не отжимается, ревилер не сворачивается.
Офлайн
1
Ну тогда не знаю... отладку приложения нужно делать, смотреть пошагово что происходит во время отжатия кнопки.
Офлайн
0
Итого, если кому интересно, привел код в рабочее состояние. Тему считать закрытой. Спасибо 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)
Офлайн