Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/04/2007, à 03:59

syeric

[RESOLU]pygtk : deux questions de notebook

Salut à tous

Alors voilà, je me suis lancé dans l'aventure pygtk pour un projet.

Situation :
- je n'utilise pas glade
- Mon niveau de connaissance de pygtk est faible.

Dans une fenêtre, je veux mettre un notebook. Jusque là, ça va.

Ensuite, je veux mettre un bouton "fermer" dans les tabs. J'y suis arrivé mais ce n'est pas encore la réussite totale.

J'obtiens ceci :

qtp7p3ji.png

Grâce au code :

#!/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):

        "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)



        #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):
	"Fonction de suppression de page"
	#On récupère la page courante

        page = notebook.get_current_page()
	#On la supprime

        notebook.remove_page(page)

        # 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)

            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()

Seulement, voilà !
J'ai deux envie supplémentaires :

- A l'heure actuelle, lorsque je clique sur le bouton "fermer" d'une fenetre qui n'est pas en surbrillance, cela ferme quand même celle en surbrillance. Ce résultat est parfaitement logique si on regarde le code. Mais je n'arrive pas à faire autrement...

- J'aimerais disposer d'un bouton pour rajouter une page automatiquement. Là aussi, je butte !

Si vous aviez des pistes à explorer, ce serait super sympa !

A+

Syeric

Dernière modification par syeric (Le 16/05/2007, à 18:29)

Hors ligne

#2 Le 28/04/2007, à 18:54

marc31

Re : [RESOLU]pygtk : deux questions de notebook

hihih, moi je le fais en php-gtk2 :-) peut-etre que je pourrais retrouver le code s'il faut vraiment.

pour t'aider chaque onglet doit avoit un ID, et il faut associer cet ID a la callback de fermeture de l'onglet. Dans ton code : page = notebook.get_current_page() n'est pas bon, c'est certain.


ubuntu-gutsy / ATI RC410 [Radeon Xpress 200] + Nvidia GeForce 7300 SE / wireless RaLink RT2500 / toulouse-ouest / xmpp://marc.quinton@jabber.org

Hors ligne

#3 Le 16/05/2007, à 18:28

syeric

Re : [RESOLU]pygtk : deux questions de notebook

Salut !

Bon, désolé, j'ai du retard !

J'ai finalement trouvé la solution. Tu avais raison marc31, la méthode notebook.get_current_page() n'était pas bonne.

Il faut en fait utiliser notebook.remove(widget), où widget et le premier enfant de la page. Dans mon cas, il s'agit de frame.

Voici le nouveau code :

#!/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()

A+

Syeric

Hors ligne