Notebook avec bouton fermer pygtk
Par syeric, mercredi 16 mai 2007 à 18:22 :: Python
Salut !
Python est un langage que j'affectionne particulièrement. La syntaxe n'est pas très lourde, c'est orienté objet et ça s'avère très puissant. De plus, il est portable sous windows et mac. Associé à la bibliothèque graphique pygtk, on peut faire des trucs très sympa :)
J'ai galèré un bon moment avant d'arriver à faire un notebook (plusieurs onglets dans la même fenêtre) avec un bouton "fermer" dans l'onglet. Je donne donc la solution si il y en a que ça intéresse ;-)
[python]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# notebook.py
import pygtk
pygtk.require('2.0')
import gtk
class NotebookExample:
def add_icon_to_button(self,button):
"Fonction pour ajouter un bouton fermer"
#création d'une boite horizontale
iconBox = gtk.HBox(False, 0)
#Création d'une image vide
image = gtk.Image()
#On récupère l'icone du bouton "fermer"
image.set_from_stock(gtk.STOCK_CLOSE,gtk.ICON_SIZE_MENU)
#On enlève le relief au bouton (donné en attribut)
gtk.Button.set_relief(button,gtk.RELIEF_NONE)
#On récupère les propriétés du bouton
settings = gtk.Widget.get_settings(button)
#On affecte à w et h les dimensions
(w,h) = gtk.icon_size_lookup_for_settings(settings,gtk.ICON_SIZE_MENU)
#On modifie ces dimensions
gtk.Widget.set_size_request(button, w + 4, h + 4)
image.show()
#On met l'image dans la boite
iconBox.pack_start(image, True, False, 0)
#On ajoute la boite dans le bouton
button.add(iconBox)
iconBox.show()
return
def create_custom_tab(self,text, notebook, frame):
"Crée une tab customisée avec un label et un bouton fermer"
#On crée une eventbox
eventBox = gtk.EventBox()
#On crée une boite horizontale
tabBox = gtk.HBox(False, 2)
#On crée un label "text" (text donné en attribut)
tabLabel = gtk.Label(text)
#On crée un bouton
tabButton=gtk.Button()
#On lui affecte la méthode remove_book
tabButton.connect('clicked',self.remove_book, notebook, frame)
#On ajoute l'image au bouton en utilisant la méthode add_icon_to_button
self.add_icon_to_button(tabButton)
eventBox.show()
tabButton.show()
tabLabel.show()
#On attache label et bouton à la boite
tabBox.pack_start(tabLabel, False)
tabBox.pack_start(tabButton, False)
tabBox.show_all()
#On ajoute la boite à l'eventbox
eventBox.add(tabBox)
return eventBox
def remove_book(self, button, notebook, frame):
"Fonction de suppression de page"
#On supprime la page. Le secret, c'est de donner comme argument le widget enfant de la page, ici un cadre frame.
notebook.remove(frame)
# On actualise le widget
notebook.queue_draw_area(0,0,-1,-1)
def delete(self, widget, event=None):
gtk.main_quit()
return False
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("delete_event", self.delete)
window.set_border_width(10)
#On crée un nouveau notebook
notebook = gtk.Notebook()
window.add(notebook)
notebook.show()
# On ajoute quelques pages
for i in range(5):
page_number = i + 1
frame = gtk.Frame("Frame %d" % page_number)
frame.set_border_width(10)
frame.set_size_request(100, 75)
frame.show()
label = gtk.Label("Dans la Frame %d" % page_number)
frame.add(label)
label.show()
eventBox = self.create_custom_tab("Tab %d" % page_number, notebook, frame)
notebook.append_page(frame, eventBox)
# Page que nous verrons à l'ouverture (page 4)
notebook.set_current_page(3)
window.show()
def main():
gtk.main()
return 0
if __name__ == "__main__":
NotebookExample()
main()
Et voilà ! A l'exécution de ce script, vous obtiendrez ça :
A bientôt !
Sylvain