Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » GTK сигналы с reveal разворачиванием по нажатии toggle_button [RSS Feed]

#1 Авг. 4, 2015 16:54:01

sergeich1992
Зарегистрирован: 2015-05-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

Здравствуйте. Есть код, приложенный ниже, в котором определены сигналы для 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)

Офлайн

#2 Авг. 5, 2015 08:17:18

b_oss
От:
Зарегистрирован: 2008-10-05
Сообщения: 17
Репутация: +  1  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

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

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)

Офлайн

#3 Авг. 6, 2015 12:31:10

sergeich1992
Зарегистрирован: 2015-05-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

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

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

Пока решить не удалось.

Офлайн

#4 Авг. 6, 2015 13:49:56

b_oss
От:
Зарегистрирован: 2008-10-05
Сообщения: 17
Репутация: +  1  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

Если я правильно понимаю, нужно отлавливать отдельно нажатие и отжатие кнопки. И при этом нажато не более одной кнопки. Тогда можно код дополнить так:

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



Офлайн

#5 Авг. 6, 2015 15:22:48

sergeich1992
Зарегистрирован: 2015-05-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

Я пытался сделать примерно так же - работоспособность никакая. Четко по вашему коду почему-то не отрабатывает блок else. Не вполне понимаю, почему так выходит. То есть кнопка не отжимается, ревилер не сворачивается.

Офлайн

#6 Авг. 6, 2015 17:04:05

b_oss
От:
Зарегистрирован: 2008-10-05
Сообщения: 17
Репутация: +  1  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

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



Офлайн

#7 Авг. 26, 2015 16:20:02

sergeich1992
Зарегистрирован: 2015-05-29
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

GTK сигналы с reveal разворачиванием по нажатии toggle_button

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

Офлайн

  • Начало
  • » GUI
  • » GTK сигналы с reveal разворачиванием по нажатии toggle_button[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version