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