[ gpocentek] résumé rapide pour les logs : installer python-gtk2 et python-gtk2-doc
[ gpocentek] et continuons :)
[ gpocentek] = Les bases =
[ gpocentek] == Les widgets ==
[ gpocentek] La plupart des éléments graphiques de GTK sont des objets héritant d'une classe 'Widget'. Chaque widget de la bibliothèque gtk possède également des attributs spécifiques, en particulier ce qu'ils affichent à l'écran, mais aussi leur façon de réagir aux actions de l'utilisateur.
[ gpocentek] Pour info, la classe Widget hérite elle même de la classe GObject (vous trouverez le détail des différents héritages dans /usr/share/gtk-doc/html/pygtk/class-hierarchy.html).
[ gpocentek] GObject provient de la libglib qui (pour résumer grossièrement) permet une programmation orientée objet en C. Elle a surtout été conçue comme une bibliothèque permettant de créer facilement des bindings (tels que PyGTK).
[ gpocentek] Voyons un premier exemple (class1.py).
[ gpocentek] tout le monde à son vim à dispo pour regarder les exemples ? :)
[ alex1872] yes
[ yannick_lm] oui
[ yannick_lm] il manque un ! ligne 1
[ gpocentek] ah possible
[ gpocentek] ce sera à lancer avec python class1.py de toute façon ;)
[ gpocentek] ok
[ gpocentek] Les 3 premières lignes permettent d'importer gtk, et en particulier la version 2.x de cette bibliothèque.
[ gpocentek] import pygtk
[ gpocentek] pygtk.require('2.0')
[ gpocentek] import gtk
[ gpocentek] On définit ensuite une classe dont le constructeur construit tout simplement une fenêtre (vide). Les fenêtres (et dérivés, comme les 'Dialog's) sont les éléments premier d'une application GTK.
[ gpocentek] self.w = gtk.Window()
[ gpocentek] Cette ligne crée l'objet, mais il faut ensuite l'afficher grâce à la méthode 'show()'. Ceci est valable pour n'importe quel widget. La méthode 'hide()' cache l'objet.
[ gpocentek] Notre fenêtre existe donc, et est affichée... ou presque. Il nous faut également démarrer GTK, en appelant la boucle principale grâce à
[ gpocentek] gtk.main()
[ gpocentek] questions ?
[ illovae] oui
[ yannick_lm] le require: c'est exactement 2 ou 2 ou supérieur ?
[ illovae] euh donc en gros on créer une fenetre vide là c'est ça ?
[ gpocentek] illovae: oui
[ gpocentek] yannick_lm: 2.x
[ illovae] gpocentek: et on peut définir la taille que devrai prendre la fenêtre ?
[ waloo] ça quitte pas, mais j'imagine que c'est normal
[ gpocentek] waloo: j'y viens après
[ gpocentek] illovae: oui, avec w.set_default_size(x, y)
[ illovae] ok thanks
[ gpocentek] illovae: mais peu importe pour le moment
[ illovae] ok bon
[ LeGreffi3R] le constructeur, c'est une sous classe nommée __init__ toujours?
[ illovae] je le rajoute pas alors :>
[ gpocentek] LeGreffi3R: oui, cf le cours précédent ;)
[ LeGreffi3R] la sous-classe main est aussi obligatoire?
[ gpocentek] LeGreffi3R: non
[ LeGreffi3R] ok pardon, je me disais bien aussi :)
[ gpocentek] et en fait j'utilise de l'orienté objet mais c'est pas une obligation
[ gpocentek] c'est juste pratique :)
[ gpocentek] let's continue
[ gpocentek] Exécutez le script (python class1.py), et vous verrez s'afficher votre fenêtre. Essayez maintenant de la fermer grâce à la 'croix'. La fenêtre disparaît, mais ce n'est pas pour autant que le programme s'est terminé. En effet, nous sommes toujours à l'intérieur de la boucle GTK principale. Nous allons voir comment en sortir (autrement qu'avec ctrl+c).
[ waloo] (:
[ illovae] ah la vache
[ LeGreffi3R] \o/
[ illovae] c'est trop bien
[ illovae] j'ia pas de croix moi ?
[ gpocentek] vous avez pigé le principe de la boucle ?
[ illovae] ah oui pardon :}
[ illovae] gpocentek: je suis obliger de tuer la fenetre perso si j'ai pas de menu
[ yannick_lm] oui
[ gpocentek] illovae: c'est à dire ?
[ illovae] gpocentek: dwm j'ai pas de croix
[ gpocentek] ah ok
[ LeGreffi3R] illovae> :)
[ illovae] LeGreffi3R: ^^'
[ gpocentek] kill avec ctrl+c alors...
[ illovae] ouip
[ gpocentek] quelle idée aussi ^^
[ LeGreffi3R] meta+c?
[ illovae] LeGreffi3R: oui ;)
[ gpocentek] bref, je continue
[ LeGreffi3R] plutot que control :)
[ gpocentek] == Les signaux ==
[ gpocentek] A chaque fois qu'il se passe quelque chose sur l'interface, un ou des signaux sont reçus/envoyés. Un clic sur un bouton, la saisie de texte, le déplacement de la souris, etc. sont des évènements qui provoquent ces signaux.
[ gpocentek] Cliquer sur la 'croix' d'une fenêtre émet le signal 'destroy' sur la fenêtre. On peut bien évidemment définir ce qui se passe en cas de réception de ce signal. C'est ce qui est fait dans class2.py :
[ gpocentek] self.w.connect("destroy", self.end)
[ gpocentek] La méthode 'connect' permet ici d'appeler la méthode 'end' de notre classe lorsque le signal 'destroy' est reçu par notre fenêtre.
[ gpocentek] Dans notre exemple, la méthode 'end' appelle simplement 'gtk.main_quit', ce qui a pour effet de nous faire sortir de la boucle principale, et de quitter normalement le programme.
[ gpocentek] essayez :)
[ illovae] bon :}
[ gpocentek] est-ce que c'est ok ?
[ yannick_lm] ok
[ gpocentek] illovae: dsl pour toi...
[ illovae] gpocentek: c'est là qui va définir un "enregistrer avant de quitter" ?
[ illovae] gpocentek: bah c'est pas de ta faute ^^
[ gpocentek] illovae: par exemple oui
[ gapz] illovae: tu peux utiliser le raccourci clavier qui va bien
[ No`] question: existe-t-il un "catalogue" des signaux ? J'imagine qu'on ne les invente pas...
[ gpocentek] No`: dans la doc
[ gapz] ca fait la meme chose que quand tu fermes avec la croix
[ illovae] gapz: oui oui mais, pas pour bien fermer
[ gpocentek] je l'aborde tout à l'heure
[ No`] gpocentek: :/
[ illovae] gapz: ah bon ? je matte ça
[ gpocentek] No`: pygtk sans la doc, bof...
[ illovae] héhé
[ gpocentek] au moins au début
[ gapz] illovae: bah si tu n'indique pas les choses qui vont bien ca ne se ferme pas correctement
[ gpocentek] ok pour tout le monde ?
[ gpocentek] d'autres questions ?
[ No`] gpocentek: oui, elle est sûrement ccomplète, mais je l'ai toujours trouvée fouillie bordélique
[ gpocentek] No`: devhelp est ton ami
[ illovae] gapz: en même temps j'ai jamais eu à fermer du graphiques sans menu jusqu'à présent ^^'
[ gpocentek] je continue ?
[ illovae] oui :)
[ gpocentek] ok
[ gapz] illovae: perso j'utilise toujours le raccourci qui va biezn
[ gapz] bien*
[ gpocentek] Vous noterez que le 'w', second argument de la méthode 'end()' est simplement le widget qui a reçu le signal. Nous en reparlerons plus tard.
[ gpocentek] (dans class2.py)
[ gpocentek] == Conteneurs ==
[ gpocentek] === Elément unique ===
[ gpocentek] Certains widgets sont des conteneurs, ils peuvent inclure d'autres widgets. Les fenêtres en sont un exemple. Regardons l'exemple 3 (class3.py) qui insert un bouton dans la fenêtre.
[ gpocentek] (ouvrez le fchier ;) )
[ gpocentek] Une fois notre bouton créé grâce à 'gtk.Button()', nous l'ajoutons simplement grâce à la méthode 'add()' de l'objet w. On connecte le boutton au signal 'clicked', qui permettra de fermer la fenêtre.
[ gpocentek] Ce type de conteneur a bien évidemment des limites, puisqu'on ne peut y inclure qu'un seul widget.
[ gpocentek] je vais p'tet un peu vite là
[ gpocentek] ça va pour tout le monde ?
[ gpocentek] désolé
[ illovae] donc oui c'est bon ça va pas trop vite
[ yannick_lm] ok pour moi
[ gpocentek] ok
[ gpocentek] donc vous voyez là que le cloc sur le bouton fait fermer la fenêtre
[ gpocentek] clic*
[ illovae] ouaip
[ gpocentek] ok, continuons avec les boîboîtes :)
[ gpocentek] === Les boîtes ===
[ gpocentek] Les boîtes ('HBox' et 'VBox') permettent d'inclure plusieurs éléments, de manière soit horizontale, soit verticale. Une fois qu'une boîte est créée, on y ajoute les éléments, soit au début, soit à la fin, grâce au méthode 'pack_start' et 'pack_end'. Regardons l'exemple 4 (class4.py).
[ gpocentek] aux méthodes*
[ gpocentek] La création d'une boîte est faite grâce à HBox() ou VBox() suivant le sens voulu. Ces méthodes prennent deux arguments. Le premier doit être 'True' si chaque case de la boîte doit avoir la même dimension. Le second est la taille de la marge entre les éléments (en pixels).
[ gpocentek] 'pack_start' et 'pack_end' prennent 4 arguments :
[ gpocentek] - le widget à insérer ;
[ gpocentek] - True si l'espace doit être rempli ;
[ gpocentek] - True si le widget doit lui même remplir l'espace alloué ;
[ gpocentek] - une marge supplémentaire pour le widget.
[ gpocentek] ok pour les Box ?
[ illovae] non j'ai une question
[ gpocentek] ouep
[ illovae] pour btn0 = gtk.Button("btn0") >> là on a pas vbox etc pourquoi ça marche quand même ?
[ gpocentek] hum, je saisis pas ta question
[ gpocentek] là on crée le button
[ gpocentek] bouton*
[ illovae] ah oui ok non c'est moi j'avais pas pigé que le vbox c'est sur la second ligne
[ gpocentek] ok :)
[ illovae] attend les boites sont définie par la seconde ligne donc ?
[ gpocentek] vous pouvez vous amuser à changer les False/True pour voir comment ça réagit
[ illovae] c'est ça en fait non ? > hbox.pack_start(vbox, False, False, 2)
[ gpocentek] illovae: on définit d'abord un hbox
[ gpocentek] dans laquelle on inclut un bouton, puis une vbox
[ illovae] ah oui okay
[ gpocentek] et à l'intérieur de la vbox on inclut 2 bouton
[ gpocentek] s
[ illovae] ah okay c'est en cascade oui, cf les autres cours pour la syntax du code en lui-même
[ waloo] l'ordre des appels à show() a une importance ?
[ illovae] autant pour moi
[ gpocentek] waloo: non, aucune
[ gpocentek] c'est l'ordre des pack_{start,end} qui joue
[ gpocentek] on pourrait balancer tous les .show() dans n'importe quel sens à la fin
[ waloo] ok
[ waloo] mm
[ waloo] l'espace est pas rempli pareil si je met le w.show(à tout à la fin
[ illovae] ça sert à quoi d'ailleurs les show ? juste pour qu'on les voit ?
[ gpocentek] waloo: hum, ça devrait pas
[ illovae] si on les met à priori c'est pour les voir non ?
[ gpocentek] illovae: justement pas forcément
[ gpocentek] tu peux très bien vouloir définir un widget sans l'afficher tout de suite par exemple
[ illovae] arf okay
[ waloo] si je met show à la fin, ma fenetre semble prend la dimension du contenu, sinon elle est plus grande
[ illovae] hum
[ waloo] et j'ai de l'espace entre les bouton
[ waloo] s
[ gpocentek] waloo: ah, faudra que je regarde ça, j'suis un peu surpris là
[ gpocentek] ah oui tiens
[ gpocentek] waloo: j'ai pas de réponse au mystère, dsl
[ waloo] ok, pas grave :)
[ LeGreffi3R] mais si mais si
[ crevette] peut-etre un bug au niveau du calcul
[ LeGreffi3R] la VBox est défini à false
[ LeGreffi3R] pour l'espace rempli par la boite et par les widgets
[ LeGreffi3R] donc ça maigrit les boutons dans le sens vertical
[ gpocentek] bien vu ^^
[ waloo] c'etait pareil dans l'exemple 3 avec un seul bouton
[ gpocentek] ok
[ Hypergraphe] re
[ Whidou] excusez-moi... où puis-je trouver le script dont on parle ? désolé, j'ai raté le début :(
[ gpocentek] dsl pour le flou, je continue
[ gpocentek] Whidou: http://u-classroom.net/cours/langages/python4.tgz
[ Whidou] merci
[ gpocentek] Vous remarquez que chaque boutton est connecté à un signal "clicked", qui permet d'appeler la même fonction à chaque fois. La second argument passé à la fonction est le widget cliqué, et le résultat de cette fonction varie selon cet argument.
[ gpocentek] les clics sur les boutons affichent le texte sur la console
[ gpocentek] c'est OK ça ?
[ crevette] oui
[ waloo] ok
[ yannick_lm] nickel
[ alex1872] oui
[ gpocentek] Juste un petit mot sur les tableaux
[ gpocentek] Les tableaux (Table) fonctionnent de manière similaire aux boîtes mais permettent évidemment des placements suivant les 2 dimensions.
[ gpocentek] je passe vite là dessus, c'est facilement utilisable (plus que les box en fait)
[ gpocentek] cf gtk.Table dans la doc
[ crevette] ouais mais ca repecter la HIG
[ crevette] respecte
[ crevette] +pas
[ gpocentek] possible, c'est assez pratique souvent
[ yannick_lm] crevette: HIG ?
[ gpocentek] Human Interface Guide il me semble
[ waloo] c'est comme en html, les tables pour le layout saymal :)
[ gpocentek] :)
[ gpocentek] ok, vous pouvez jeter un oeil à class5.py
[ gpocentek] il contient une accumulation de widgets divers
[ gpocentek] (label, entry, checkbox, togglebtn, radiobtn, séparateur, combobox et bouton)
[ gpocentek] est-ce qu'il y a des questions sur ces widgets ?
[ waloo] etrange la façon dont sont construites les options
[ gpocentek] c'est à dire ?
[ waloo] on construit le secons par référence au premier ?
[ gpocentek] ah oui
[ gpocentek] en fait plusieurs de ces widgets forment un tout
[ waloo] je crois comprendre la logique
[ gpocentek] waloo: si tu as plusieurs groupes de boutons radio, il faut savoir qui va avec qui
[ waloo] oui pour ne pouvoir selectionner qu'une option parmi plusieurs
[ gpocentek] voilà
[ waloo] oui ok
[ gpocentek] d'autres questions ?
[ waloo] si on en construit un troisieme, on passe opt1, opt2 ou peu importe ?
[ gpocentek] waloo: peu importe
[ waloo] (peu importe visiblement)
[ waloo] :)
[ illovae] dur quand même le passage du 4 au 5 ^^
[ shaz] salut
[ gpocentek] illovae: ce sot juste des exemples
[ gpocentek] je vous filerez les liens vers la doc
[ illovae] yes merci
[ illovae] salut shaz
[ gpocentek] vous avez pu installer python-gtk2-doc ?
[ waloo] vi
[ yannick_lm] yep
[ gpocentek] on va voir un petit exemple de doc alors
[ illovae] gpocentek: comment on fait pour faire des sous-menu dans le super combo gtk ?
[ illovae] c'est ça qui est utiliser pour les menus non ?
[ gpocentek] illovae: dans ce type de combo c'est pas possible
[ gpocentek] non non, c'est pas un menu
[ waloo] illovae: je crois qu'il y a des
[ gpocentek] voilà
[ illovae] gpocentek: waloo: ok
[ illovae] sinon
[ illovae] pour l'icone je pige pas :x
[ illovae] pour quitter
[ crevette] illovae: y a un widget special pour ca
[ gpocentek] illovae: pour l'icone, c'est un élément spétial
[ gpocentek] spécial*
[ illovae] crevette: gpocentek: ok... mais je vois pas c'est lequel en fait dans le code
[ smarter] Lutin: creve :P
[ illovae] ah stock peut être
[ pluc] J'anticipe sur le pygtk avancé, mais en pratique pour une vraie appli, on utilise toujours le hbox/vbox ou on se sert de glade ?
[ crevette] a part si j'ai pas compris la question
[ Lutin] smarter: mwahaha
[ gpocentek] illovae: combo = gtk.combo_box_new_text()
[ gpocentek] ok
[ gpocentek] illovae: combo box c'est juste une liste défilante d'éléments
[ gpocentek] que tu peux choisir
[ illovae] ok
[ gpocentek] pour le bouton
[ gpocentek] en fait GTK propose des éléments "stock"
[ gpocentek] créer un bouton avec un élément du stock permet de créer ce genre de boutons (avec icone + texte)
[ gpocentek] c'est ce que j'utilise dans notre cas
[ gpocentek] b = gtk.Button(stock = gtk.STOCK_QUIT)
[ gpocentek] on peut utiliser gtk.STOCK_OK par exemple
[ gpocentek] illovae: c'est clair ?
[ illovae] oui très merci
[ gpocentek] ok pour tout le monde ?
[ crevette] ouip
[ waloo] oui
[ yannick_lm] ok
[ illovae] maintenant ça va être comment on met du code en relation avec ce cliquodrome ^^
[ gpocentek] illovae: ça... suffit de connecter aux signaux
[ gpocentek] et après c'est plus du domaine de GTK ;)
[ gpocentek] à propos de la doc
[ illovae] ah ok, faut que je révise les cours précédents, merci pour la précision
[ gpocentek] regardez /usr/share/gtk-doc/html/pygtk/class-gtkwidget.html
[ gpocentek] (dans firefox par exemple)
[ gpocentek] vous avez tous les éléments standards d'un widget
[ waloo] oula y'a du monde dans la doc :)
[ crevette] file:///usr/share/gtk-doc/html/pygtk/class-gtkwidget.html
[ gpocentek] No`: notamment les signaux dispos ;)
[ gpocentek] voyez aussi : /usr/share/gtk-doc/html/pygtk/class-hierarchy.html
[ gpocentek] c'est assez intéressant ça
[ gpocentek] ça vous montre toutes les relations entre widgets
[ gpocentek] vous voyez par exemple qu'une checkbox c'est un togglebtn en fait
[ gpocentek] donc la checkbox possède tous les éléments d'un toggle button
[ gpocentek] c'est OK ça ?
[ crevette] oui
[ gpocentek] ça vous permet de naviguer dans la doc et les widgets
[ gpocentek] je vous conseille d'utiliser devhelp
[ crevette] oui
[ illovae] c'est quoi ?
[ crevette] devhelp c'est bien (r)
[ gpocentek] c'est pas une appli extraordinaire, mais il y a une fonctionne de recherche
[ illovae] c'est du graphique on dirait :>
[ gpocentek] oui :)
[ gpocentek] illovae: tu peux grepper dans les .html aussi :p
[ illovae] en même temps dans un cours sur py *gtk* hein ^^'
[ gpocentek] hehe
[ illovae] gpocentek: héhé je vais me faire un truc en python pour la peine ;)
[ gpocentek] est-ce qu'il y a des questions sur tout ce qu'on a vu ?
[ waloo] tiens j'intégrerais bien la doc dans kolekti moi :)
[ gpocentek] encore une fois je rentre pas dans le détail
[ illovae] moi mais je sais pas si c'est en rapport
[ waloo] (osef)
[ gpocentek] mais vous avez déjà sous la main tout ce qu'il faut pour faire une appli gtk
[ illovae] gpocentek: alors que j'ai voulu recompiler pygtk pour avoir la doc j'ai vu un useflag opengl, tu vas nous en parler ?
[ gpocentek] illovae: non, jamais utilisé...
[ crevette] ma reponse est dans la question
[ crevette] s/ma/la/
[ obiwane] j'ai pas compris les true et false de pack_start
[ illovae] ok bon, je me demandais à quoi ça pouvait servir
[ gpocentek] obiwane: ok, je reprends ça si tu veux
[ waloo] obiwane: padding/margin :)
[ obiwane] padding margin?? :)
[ gpocentek] ça résume assez bien si on connait html/css
[ waloo] bon si ça te parle pas plus
[ yannick_lm] expand/fill
[ obiwane] je connais pas html
[ gpocentek] obiwane: si tu as True pour le premier, gtk va essayer de remplir la 'case' de la boite
[ waloo] ok ça t'aide pas alors, désolé
[ booboule] bonsoir, j'ai un peu loupper la sceance, est ce que vous pourriez faire un resumer comme ce que vous aviez fait pour les lecons precedentes ?
[ cemoi] même à moi ça me parle le padding/margin
[ illovae] booboule: ouai y'aura un log ;)
[ gpocentek] obiwane: si c'est à False, le widget sera collé sur un coté à priori
[ gpocentek] si le 3ème argument est True, c'est le widget qui sera agrandi, si c'est False, ce sera rempli avec de l'espace
[ gpocentek] mais uniquement si le 2ème argument est à True
[ gpocentek] obiwane: est-ce que c'est un peu plus clair ?
[ obiwane] oue
[ flo|va-nu-pied] tiens cemoi ; j't'avais pas vu j'etais au fond
[ obiwane] merci
[ gpocentek] obiwane: fais toi un box avec 2 boutons dedans, et joue avec les valeurs
[ gpocentek] c'est le meilleur moyen de comprendre
[ gpocentek] ok
[ obiwane] ok
[ cemoi] :)
[ gpocentek] je voudrais aborder quelque chose d'un peu plus complexe pour la suite
[ gpocentek] les treeview
[ illovae] gpocentek: question: admettons que je créer une fenetre dans laquelle je dois rentrer des données puis faire ok. Le clic sur ok entraîne la fermeture de la fenetre, et l'apparition d'une autre fenetre avec le résultat, comment on peut mettre ça en place ?
[ illovae] avec un bouton annuler sur la seconde ou quoi et revenir sur la premier
[ waloo] gpocentek: on peut mettre d'autre types d'objets que des widgets dans une fenetre ? (images,html) ?
[ gpocentek] illovae: btn.connect("clicked", run_new_window)
[ illovae] gpocentek: je note merci
[ gpocentek] waloo: images oui, html aussi mais c'est un widget particulier
[ crevette] waloo: html via pygtkmozembed je crois
[ Whidou] pour les images, il faut un canvas comme tkinter ?
[ gpocentek] Whidou: il y a plusieurs solutions, c'est la bibliothèque gdk qui gère ça essentialement, avec du plus haut niveau dans gtk
[ waloo] ha oui y'a un canvas ? (j'imagine que oui, dans gtk, y'a gimp tout de même)
[ Whidou] ok
[ gpocentek] je suis loin d'être un pro sur la gestion des images
[ gpocentek] on voit les treeviews ?
[ waloo] gpocentek: je pensais juste afficher un image en fait :)
[ illovae] ouaip
[ waloo] ha oui
[ gpocentek] ok
[ cheuveulu] pour une utilisation simple(affichage) il y a gtk.Image
[ illovae] treeview ça veut dire quoi ?
[ gpocentek] illovae: tu vas voir ;)
[ gpocentek] = Widgets avancés =
[ gpocentek] == treeview ==
[ gpocentek] (des titres pour le futur parser de logs ;) )
[ gpocentek] Les 'treeview' sont des widgets utilisés pour lister des éléments. Ils font intervenir des 'tree stores', des listes plus ou moins complexes d'éléments multiples. Un exemple d'utilisation de ces treeview est la liste des paquets de synaptic. On peut y inclure toutes sortes d'éléments (checkbox, texte...).
[ gpocentek] illovae: tu vois ce que ça donne, ou t'as jamais ouvert synaptic ? :)
[ illovae] huhu si quand même ^^
[ gpocentek] ok :)
[ illovae] avant de connaître gapz :}
[ gpocentek] Nous allons voir un exemple simple (class6.py).
[ gpocentek] (ouvrez le)
[ gpocentek] Première étape : prévoir. Un treeview est en général dynamique et s'agrandit selon les données insérées. Il faut donc prévoir les dépassement d'écran. C'est que nous faisons en utilisant une fenêtre 'scrollée' (ScrolledWindow). Ce widget permet d'ajouter des barres de défilements au widget qu'il va inclure (c'est un conteneur).
[ gpocentek] Deuxième étape : créer la liste des éléments. En effet, les éléments ne sont pas créés dans le widget, mais dans un 'TreeStore'. Ceci permet notamment d'avoir un unique conteneur d'éléments et plusieurs représentations.
[ gpocentek] store = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING) crée la liste, contenant 2 éléments par ligne (ce sont de simple type int et str mais à la sauce gobject). Pour parcourir cette liste et y ajouter nous passons par 2 étape. On définit tout d'abord l'élément (iter) sur lequel on veut travailler.
[ gpocentek] (désolé pour les fautes)
[ gpocentek] Dans notre cas, le suivant sur la liste (qui sera le premier puisque l'on n'a rien dans la liste pour le moment) :
[ gpocentek] iter = store.append(None)
[ gpocentek] On utilise ensuite cet élément pour insérer les valeurs :
[ gpocentek] store.set(iter, 0, 1, 1, "one")
[ gpocentek] questions ?
[ Whidou] on peut faire un treeview avec des lignes interchangeables sur glissé-déposé ?
[ waloo] c'est bien la distinction treeStore/treeView, très MVC !)
[ gpocentek] Whidou: oui, hors topic pour aujourd'hui :)
[ Whidou] ok
[ gpocentek] c'est clair le remplissage du treestore ?
[ cheuveulu] peut on ajouter une classe perso de le Treestrore?
[ waloo] gpocentek: là on a fait une liste, on peut faire un arbre ?
[ crevette] bof bof ...
[ illovae] moi j'ai pas pigé ta dernière phrase
[ gpocentek] waloo: on peut
[ crevette] waloo: oui
[ gpocentek] illovae: hum...
[ crevette] c'est pas tres clair la
[ crevette] (j'essaie de lire le code)
[ gpocentek] pour l'insertion des éléments ?
[ gpocentek] ok
[ illovae] ouai iter c'est okay a priori, mais 0, 1, 1 c'est quoi ?
[ gpocentek] ah oui
[ gpocentek] ça fonctionne par couple
[ gpocentek] store.set(iter, 0, 1, 1, "one")
[ gpocentek] au rang 0, on insère la valeur 1
[ gpocentek] au rang 1 on insère la valeur "one"
[ gpocentek] 0, 1, puis 1, "one"
[ gpocentek] c'est plus clair comme ça ?
[ illovae] ok le rang 0 c'est quoi au juste ?
[ illovae] la diagonale ?
[ crevette] pourquoi y a 2 fois iter = store.append(None)
[ gpocentek] store = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING)
[ waloo] la colonne
[ illovae] euh non la verticale padon
[ illovae] pardon
[ illovae] ?
[ gpocentek] 0 c'est gobject.TYPE_INT, et 1 gobject.TYPE_STRING
[ illovae] ah oui ok bien sûr
[ crevette] illovae: c'est des couples de valeurs
[ illovae] oui oui ok bien sûr
[ crevette] 0, 1, 1, "one"
[ gpocentek] :)
[ gpocentek] crevette: on insère 2 valeurs
[ illovae] on pourrait faire un truc genre 0, "paf", 1, "autre paf" ?
[ illovae] ?
[ gpocentek] crevette: on met 2 fois à la fin
[ crevette] y aurait eu une troisieme colonnes il y aurait eu 0, 1, 1, "one", 2, "plouf"
[ gpocentek] illovae: oui
[ crevette] gpocentek: on insere par la fin
[ crevette] ?
[ gpocentek] crevette: ici oui
[ pluc] on ajoute l'element None à "store", et ensuite on lui donne des valeurs ? On ne peut pas creer un element "complet" et le rajouter ensuite ?
[ illovae] gpocentek: ok le 1 ça veut dire quoi donc ? pour 0, 1 ?
[ waloo] illovae: sauf qu'on a dit TYPE_INT pour la colonne 0
[ illovae] waloo: oui donc forcément un chiffre...
[ waloo] donc "paf" ... paf exception
[ gpocentek] illovae: 0, 1 assigne la valeur "1" (le nombre) au rang 0
[ illovae] ok tout simplement d'accord
[ gpocentek] pluc: 'None' veut dire qu'on ajoute à la fin de la liste
[ illovae] on dirait des legos en fait c'est marrant
[ gpocentek] pluc: on pourrait ajouter après un rang particulier
[ gpocentek] illovae: ben c'est ça
[ illovae] ouai c'est tout con une fois qu'on connaît le nom des pièces et comment elles doivent s'emboiter ensemble
[ pluc] curieux, mais d'accord ;-)
[ waloo] donc "paf" ... paf exception
[ waloo] oops
[ gpocentek] c'est un peu plus clair pour tout le monde ?
[ waloo] ok, visiblement on est pas obligé de 'remplir' les ligns non plus
[ illovae] oui :)
[ yannick_lm] ok pour moi
[ gpocentek] waloo: non
[ waloo] store.set(iter, 2, "three") a l'air de marcher
[ crevette] gpocentek: gtk.CellRendererText() ca créé un widget de text sur toute la longeur du tree ?
[ gpocentek] crevette: j'y viens
[ gpocentek] Etape suivante : créer l'interface. On va la créer à partir de notre liste, donc :
[ gpocentek] treeview = gtk.TreeView(store)
[ gpocentek] Il nous faut maintenant créer chaque colonne. Comme nous l'avons vu plus haut, un TreeView peut contenir plusieurs types d'éléments. Il nous faut donc préciser que les colonnes contiendront du text. On utilise pour ça un widget CellRendererText. On crée une colonne en l'utilisant :
[ gpocentek] column = gtk.TreeViewColumn("Entier", renderer, text=0)
[ gpocentek] Le premier argument est le titre de la colonne, le second le renderer, et le troisième l'identité de la colonne (on a aura plusieurs).
[ gpocentek] on en aura*
[ gpocentek] On ajoute ensuite la colonne au treeview :
[ gpocentek] treeview.append_column(column)
[ gpocentek] est-ce que c'est pigé ?
[ crevette] oki
[ crevette] donc je disais une betise
[ crevette] c'est par "cellule"
[ gpocentek] oui
[ waloo] par colonne plutot
[ crevette] oui, plutot
[ gpocentek] cellule/colonne se mêlent
[ illovae] ok et dans le cas de synaptic il suffit de relier ça^Wconnecter pardon aux signaux genre fichier xml contenant la liste des paquets ?
[ waloo] oui toutes les cellules de la meme colonne sont visiblement du meme type :)
[ yannick_lm] question: comment of fait pour que les colonnes soient redimensionnables ou pas ?
[ gpocentek] illovae: oui, on parse le fichier de paquets, on crée le store avec ça, puis on affiche
[ yannick_lm] ça ce gère au niveua du renderer ?
[ Whidou] il peut y avoir plusieurs CellrenderText ?
[ crevette] yannick_lm: du treeview je pense
[ gpocentek] yannick_lm: non c'est au niveau du treeview
[ gpocentek] je te retrouve ça
[ gpocentek] yannick_lm: pardon, c'est au niveau du TreeViewColumn
[ crevette] gtk.TreeView.set_hadjustment ?
[ gpocentek] gtk.TreeViewColumn.set_resizable
[ waloo] gtk.CellRenderer.set_fixed_size ?
[ illovae] sinon moi j'ai une question peut être un peu conne, pourquoi on doit d'abord définir la column avec ce qu'il y a dedans _puis_ demander d'ajouter la column au treeview (deux étapes quoi). Ça serait pas plus simple finalement de définir directement l'affichage ? (ou alors c'est juste pygtk qui est fait comme ça ?)
[ yannick_lm] ok. Apparement, on peut faire ça en plusieurs endroits
[ gpocentek] illovae: 2ème solution
[ illovae] genre affiche moi ça avec ça et ça comme argument
[ yannick_lm] (je regadrerai le source d'exaile)
[ illovae] ok bon
[ gpocentek] ok, dernier widget pour ce soir
[ illovae] okay
[ gpocentek] un combo box (déjà vu), mais qui utilise un store également
[ gpocentek] == ComboBox ==
[ gpocentek] Nous avons vu un combobox tout à l'heure, avec une manière de l'utiliser. On peut également l'utiliser avec un TreeStore. Plus exactement un TreeModel, mais ces deux objets sont similaires. Voyez l'exemple class7.py.
[ gpocentek] On utilise également un renderer pour afficher du texte, et on utilise l'élément 1 de notre liste pour afficher les données. Mais la liste entière reste accessible, comme vous pouvez le voir dans la méthode show (cliquez le bouton pour afficher le réultat dans la console).
[ illovae] euh c'est où que c'est marqué qu'on utilise l'élément 1 stp ?
[ gpocentek] je vous laisse regarder et me poser des questions sur ce qui coince
[ gpocentek] illovae: c'est ce qu'on défini dans la liste
[ illovae] oui mais dans le code je veux dire
[ gpocentek] l'élément 0 c'est '1', et l'élément 1 c'est "one"
[ illovae] je vos bien le renderer pour afficher le text
[ illovae] ouai...
[ gpocentek] store = gtk.TreeStore(gobject.TYPE_INT, gobject.TYPE_STRING)
[ gpocentek] iter = store.append(None)
[ gpocentek] store.set(iter, 0, 1, 1, "one")
[ gpocentek] c'est encore lié au store
[ gpocentek] comme pour le treeview
[ illovae] mais je vois pas le lien entre le store et le combo box en fait
[ gpocentek] combo = gtk.ComboBox(store)
[ illovae] ah juste ça gtk.ComboBox(store) ça suffit ?
[ gpocentek] oui
[ illovae] ah bah la vache
[ illovae] bon je le lance, je vois pas ce que ça pet donner
[ illovae] ah la vache lol
[ gpocentek] en C c'est combo = gtk_combo_box_new_with_model (GTK_STORE (store)) :p
[ illovae] ah super le coup du show
[ gpocentek] voilà
[ illovae] ouai attend déjà le python je mouline alors le C hein ^^
[ yannick_lm] c'est assez subtil comme example en fait
[ illovae] non super mais ça sert à quoi le show en soi ?
[ gpocentek] donc tu vois s'afficher les 2 éléments (l'entier et la chaine de caractères)
[ gpocentek] illovae: regarde dans ta console
[ illovae] oui mais à quoi ça sert ?
[ illovae] de le voir dans ma console ?
[ gpocentek] c'est pour illustrer que dans l'appli tu vois que le STR_STRING mais que t'as bien l'netièreté du store
[ gpocentek] TYPE_STRING pardon
[ illovae] ah ouai
[ illovae] kewl
[ gpocentek] tu distingue complètement les données de la façon dont tu les affiches
[ illovae] sinon juste par curiosité, je vois ça print "%d: %s"
[ gpocentek] c'est du formatage de texte
[ illovae] tout de suite je pense à date +%s%d etc rien à voir non ?
[ illovae] okay
[ gpocentek] c'est le même principe
[ gpocentek] mais %d c'est un entier, %s une chaine de caractères
[ illovae] oui mais comment il sait que %d == le chiffre et %s == le text ?
[ illovae] ah bah voilà ok
[ illovae] bon en fait y'a rien à inventé quoi
[ gpocentek] print "%d: %s" % (my_int, my_str)
[ gpocentek] tout est donné après
[ illovae] ah oui en plus
[ illovae] mince je voyais pas la programmation comme ça moi ^^
[ crevette] iter = combo.get_active_iter() sert a recuperer le row actif ?
[ Whidou] si il y a plusieurs %s, ils sont pris dans l'ordre
[ gpocentek] crevette: exactement
[ gpocentek] Whidou: oui
[ Whidou] oui
[ illovae] Whidou: comment ça ?
[ crevette] Whidou: en fonction des parametres passés (regarde myi_int)
[ illovae] oups
[ gpocentek] python est plus casse pieds que le C pour ça
[ illovae] j'ia rajouté un %s et il plante pourquoi ?
[ illovae] print "%d: %s %s" % (my_int, my_str)
[ gpocentek] faut qu'il y ait exactement le même nombre d'arguments, dans le même ordre
[ gpocentek] illovae: là ça plante
[ Whidou] "%s %s %s"%("a","b","c")
[ crevette] illovae: y a pas de 3ieme parametre
[ crevette] ou alors ca
[ illovae] ah et alors si %s == my_str pourquoi il le répète pas ?
[ crevette] print "%d: %s %s" % (my_int, my_str, my_str)
[ gpocentek] illovae: parce que c'est comme ça :)
[ illovae] ah okay faut redef pour chaque fois...
[ waloo] illovae: %S = c'est une chaine
[ Whidou] "%s %s %s"%("a","b","c") --> a b c
[ waloo] %s
[ crevette] illovae: comment tu veux qu'il map ?
[ waloo] pardon
[ illovae] crevette: bah j'en sais rien comment en bash quoi $paf=paf donc pour chaque $paf on aura un paf
[ illovae] je pensais que %s c'était pareil
[ Whidou] ok
[ illovae] s/comment/comme
[ gpocentek] illovae: non c'est pas la même chose, c'est vraiment du formatage de texte
[ gpocentek] c'est pas du tout des assignations
[ illovae] okay
[ crevette] illovae: %s ce n'est pas une variable
[ illovae] oui je pensais
[ crevette] c'est pour formater ton output
[ illovae] ok
[ gpocentek] au passage regardez àa :
[ gpocentek] btn.connect("clicked", self.show, combo)
[ Whidou] str(my_int)+": "+str(my_str) revient au même
[ gpocentek] par rapport au bouton des premiers exemples, je passe un argument en plus
[ illovae] ouai combo non ?
[ gpocentek] voilà
[ illovae] self.show c'est pour que ça quitte bien ou continue bien je sais pas
[ gpocentek] ça me permet de le récupérer dans la fonction show()
[ illovae] ah ok, donc pour avoir le résultat de dedans le combo il faut le mettre là
[ gpocentek] illovae: dans ce cas là ça affiche juste le texte lié à l'élément actif du combo
[ gpocentek] voilà
[ illovae] ah sinon ça fait les deux ?
[ gpocentek] ?
[ illovae] j'ai viré combo
[ illovae] j'ai une erreur
[ Whidou] tous les arguments que j'ajoute après le self.show seront transmis ?
[ gpocentek] oui
[ Whidou] ok
[ illovae] ça enlève le lien entre combo et le show en fait ?
[ crevette] illovae: il faut qu'il soit dans la fonction show
[ gpocentek] illovae: oui
[ illovae] TypeError: show() takes exactly 3 arguments (2 given)
[ gpocentek] voilà, donc faut bien lui passer un argument
[ crevette] gpocentek: on aurait pu senelver le combo du connect et l'expliciter dans le show ?
[ illovae] ouai, mais comment savoir que c'est combo qu'il faut mettre ?
[ waloo] illovae: tu peux mettre n'importequel objet en fait
[ illovae] le "clicked" et le self.show ça me parait logique
[ gpocentek] crevette: avec un self.combo oui, j'ai pas vraiment utilisé de l'objet pour le coup, j'aurais pu/dû
[ illovae] waloo: hum
[ waloo] mais tu vas te servir du combo pour récupérer la valeur, donc autant passer celui-là
[ crevette] gpocentek: j'avoue que je ne comprends rien a la prog, je demande juste
[ crevette] :)
[ waloo] gruik="gruik"
[ waloo] btn.connect("clicked", self.show, combo,gruik)
[ waloo] ...
[ waloo] def show(self, btn, combo,gruik):
[ waloo] ...
[ waloo] print "%s, %d: %s" % (gruik,my_int, my_str)
[ waloo] essayes donc ça
[ illovae] ok je remplace
[ crevette] la methode connect vient d'ou au faut
[ crevette] fait, je ne la trouve pas dans button ni widget
[ gpocentek] hum, je pensais que c'était gobject mais je crois que ça vient de plus bas encore
[ crevette] c'est pas une methode, c'est un signal appremment
[ illovae] waloo: TypeError: show() takes exactly 3 arguments (4 given)
[ cheuveulu] gobject.GObject.connect()
[ crevette] merci cheuveulu
[ illovae] faut que je vire le combo non waloo ?
[ waloo] non, non
[ gpocentek] je m'étais pas trompé donc ^^
[ waloo] ajoute le aussi à def show
[ crevette] waloo: illovae, vous faites quoi donc ?
[ crevette] il faudrait un whiteboard avec le chan
[ illovae] crevette: aucune idée ^^ 'fin si on rajoute un truc au print au final
[ waloo] je ui mpntre qu'on peut passer n'importe quoi au connect
[ crevette] ca serait ubercool
[ waloo] ouais
[ crevette] y l'editeur de texte qui fait ca
[ gpocentek] illovae: waloo veut juste te montrer que tu peux passer autant d'arguments que tu veux à la fonction appelée avec connect()
[ crevette] gdebi ?
[ illovae] waloo: haha super \o/
[ illovae] gpocentek: yes ouai
[ gpocentek] ok
[ gpocentek] d'autres questions sur ce qu'on a vu ce soir ?
[ illovae] non c'est vraiment marrant
[ illovae] pff des tas à priori
[ gpocentek] hehe :)
[ waloo] hoho
[ waloo] c'est ludique
[ waloo] surtout en python
[ illovae] comment afficher plusieurs fenetres en même temps, comment faire pour en afficher par dessus sans effacer les autres en dessous ?
[ Whidou] est-ce que c'est facile de convertir mes appli tkinter en gtk ?
[ gpocentek] illovae: ah ouais tu veux aller tout de suite loin toi :)
[ cheuveulu] illovae: tu peu utiliser des gtk.Dialog
[ waloo] illovae: tu fais plusieurs gtk.Window()