Найти - Пользователи
Полная версия: GTK сигналы с reveal разворачиванием по нажатии toggle_button
Начало » GUI » GTK сигналы с reveal разворачиванием по нажатии toggle_button
1
sergeich1992
Здравствуйте. Есть код, приложенный ниже, в котором определены сигналы для 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)
b_oss

У меня в голове родился вот такой план. Возьмем например два списка:

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)

вот как то так получается. Если что не так поправляйте.

sergeich1992
b_oss
вот как то так получается. Если что не так поправляйте.

Спасибо, идея хорошая, но есть проблемы.
Что работает: при нажатии одной кнопки други отжимаются (то есть нажата всегда только одна кнопка)
Что не работает: отжатие нажатой кнопки; скрытие ревилера, активируемого одной кнопкой, при нажатии другой.

Пока решить не удалось.
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
sergeich1992
Я пытался сделать примерно так же - работоспособность никакая. Четко по вашему коду почему-то не отрабатывает блок else. Не вполне понимаю, почему так выходит. То есть кнопка не отжимается, ревилер не сворачивается.
b_oss

Ну тогда не знаю... отладку приложения нужно делать, смотреть пошагово что происходит во время отжатия кнопки.

sergeich1992
Итого, если кому интересно, привел код в рабочее состояние. Тему считать закрытой. Спасибо 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])
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