#1 Le 28/04/2007, à 02: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 :
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, à 17:29)
Hors ligne
#2 Le 28/04/2007, à 17: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, à 17: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