Página Inicial > Gtk/Gdk, GtkNoteBook > Mudando as "current_page"s do gtk.Notebook aproveitando a mesma função

Mudando as "current_page"s do gtk.Notebook aproveitando a mesma função

Aqui vai uma pequena dica para ajudar a limpar um pouco o código de programas usando GTK.

Ontem estava desenhando uma interface no Glade, e estava usando o gtk.Notebook para organizar as telas de cadastro, pesquisa, configuração essas coisas, eu acho muito mais organizado colocar cada tela em uma aba do gtk.Notebook do que ficar abrindo dezenas de janelas filho, ai criei um menu com as opções (e são muitas), e na hora de ligar os eventos a um “sinal”, me ocorreu que eu teria que criar uma função para cada opção do menu, como são muitas, pensei, será que da para aproveitar a mesma função para mudar todas as abas do gtk.Notebook?

Sim, poderia ser feito com vários “if”s ou com um “while”, para testar o nome do widget, e chamar a aba correspondente, bem mais ai a função ficaria muito grande, e eu teria que escrever quase o mesmo tanto de código.

Foi ai que uma luz apareceu, eu poderia adaptar o nome de cada gtk.MenuItem do menu e usar o nome para complementar o comando para trocar as abas, e foi isso mesmo que eu fiz em apenas 2 linhas, vou ilustrar a idéia.

Crie no Glade, ou via código mesmo uma interface simples como o exemplo abaixo, o nome dos gtk.MenuItem deve ser por exemplo menuitem_0, menuitem_1, menuitem_2.
O gtk.MenuItem com o nome menuitem_0 será usado para mostrar a aba 0 do gtk.Notebook, o nome menuitem_1 será usado para mostrar a aba 1, e assim sucessivamente.

Agora, conecte o sinal “activate” de todos os gtk.MenuItem a mesma função Ex: “changeCurrentPage”

Agora vamos ao código Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Importando bibliotecas do python
import pygtk
pygtk.require("2.0")
import gtk, gtk.glade

class testeNotebook():

	###
	# função construtora
	def __init__(self):

		# Encapsulando a interface criada no Glade-3
		self.itf = gtk.glade.XML('interface.glade')
		self.itf.signal_autoconnect(self)

		#pegando widgets da interface
		self.windowMain = self.itf.get_widget('windowMain')
		self.notebook1 = self.itf.get_widget('notebook1')

		self.windowMain.show_all()
		gtk.main()
	### __init__

	###
	# Função que altera a aba corrente do notebook1
	# está função é acionada pelo evento 'activate' dos widget menuitem_*
	def changeCurrentPage(self, widget):
		#Note que neste ponto eu pego o nome do Widget que acionou a sinal
		# e separo ele em 2 partes, a primeira é o que está antes do “_” e a segunda
		# o que está depois do “_” ou seja, o numero
		lixo, pageNumber = widget.get_name().split('_')
		# e aqui eu uso o numero do Widget para mudar a aba do  gtk.Notebook
		self.notebook1.set_current_page(int(pageNumber))
	###  changeCurrentPage

	###
	# Função que para o loop GTK
	# esta função é acionada pelo evento 'delete-event' do widget windowMain
	def sair(self, widget, data):
		gtk.main_quit()
	### sair

if __name__ == '__main__':
	testeNotebook()

Você pode baixar um exemplo aqui->

Note que o código que faz todo o trabalho são apenas 2 linhas, economiza bastante código não é ;-)

Espero que vocês tenham gostado, e até a próxima.

Categories: Gtk/Gdk, GtkNoteBook Tags: ,
  1. Nenhum comentário ainda.
  1. Nenhum trackback ainda.