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 07/07/2012, à 22:34

PengouinPdt

Python, GTK, Dialog et TreeView

Bonsoir,

Peut-on générer - est-ce correct ? - un TreeView a l'intérieur d'une fenêtre GTK Dialog ?

Mon code :

import gobject, gtk, logging

class Window_Dialog:

    def __init__(self, dic):

        self.dic = dic;

    def run(self):

        dialog = gtk.Dialog()

        dialog.set_resizable( False )
        dialog.set_size_request( 400, 300 )
        dialog.set_title( "titre de test" )

        vbMain = gtk.VBox( False, 0)

        store = gtk.ListStore( str, str )
        view = gtk.TreeView( )
        view.set_model( store )

        cellFile = gtk.CellRendererText()
        cellSum = gtk.CellRendererText()

        colFile = gtk.TreeViewColumn( 'File', cellFile, text=0 )
        colSum = gtk.TreeViewColumn( 'Checksum', cellSum, text=0 )

        for k, v in self.dic["base"].items():
            store.append( [v, self.dic["checksum"][k] ] )

        view.append_column( colFile )
        view.append_column( colSum )

        #colFile.pack_start( cellFile, True )
        #colSum.pack_start( cellSum, True )

        #colFile.add_attribute( cellFile, 'text', 0 )
        #colFile.add_attribute( cellFile, 'background', 3 )
        #colSum.add_attribute( cellSum, 'text', 0)
        #colSum.add_attribute( cellSum, 'background', 3 )


        vbMain.pack_start( view, True, True, 0 )
        #dialog.add( vbMain )

        dialog.run()
        dialog.destroy()

De fait, avec ce code, je génère deux fenêtres, dont la première est correctement "titrée" mais vide d'informations, et la seconde qui s'ouvre quand je ferme la première avec les boutons [Oui], [Non].

C'est donc que je m'y prends mal ...
Quelqu'un pourrait-il m'aiguiller, svp ?!


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne

#2 Le 08/07/2012, à 04:58

kuh

Re : Python, GTK, Dialog et TreeView

Dans ton code tu ne montre pas le moment où tu instancie Window_Dialog. Je suppose donc que tu le fais plus tard et que tu ne l'as juste pas montré. Selon moi il devrait être possible de mettre n'importe quoi dans un Dialog autant que dans un MainWindow. La différence est seulement qu'un Dialog bloque les autres fenêtres lorsqu'il est ouvert.

Dans le code que tu montre, je suppose que tu lance le Window_Dialog en appelant sa fonction run. Tu crée une AUTRE fenêtre Dialog avec le nom dialog. Vers la fin du run de Window_Dialog tu appelle le run de dialog. Donc cette fenêtre s'affiche en premier. La preuve : tu a fait set_title sur dialog et le titre s'affiche correctement dans cette fenêtre. Lorsque tu ferme dialog, il quitte son run et permet au run de Window_Dialog de terminer, donc il s'affiche avec les boutons. Il s'agit de l'instance de Window_Dialog.

En ce qui concerne le TreeView voici ce que je pense être la cause : c'est une erreur de namespace c'est-à-dire l'endroit où tu met ta variable. Tu enregistre l'instance de VBox dans vbMain qui se trouve à être une variable local à la fonction. Lorsque la fonction a fini d'exécuter, python efface le namespace de la fonction, donc le vb et lorsque GTK arrive pour l'afficher il n'y a plus rien. Pour corriger il faut mettre vbMain dans la fenêtre. Cependant je ne vois pas où tu a défini ta fenêtre et en exécutant le script il n'y a rien que une fenêtre qui s'affiche, alors il manque un bout de code. Si tu veux accéder à vbMain de l'extérieur de de la fonction, il ne doit pas être enregistré dans vbMain (namespace locale comme mentionné), mais plus tôt dans self.vbMain qui devient le namespace de la classe. Il sera accessible dans instance_Window_Dialg.vbMain

En ce qui concerne le VBox, probablement tu a reçu le message d'erreur que dialog contient déjà un VBox, alors il te faut mettre le view dans ce VBox et non le vbMain que tu a crée. Pour accédéer au VBox de Dialog, juste écrire :

     dialog.vbox.pack_start( view, True, True, 0 )

à la place de la ligne

     vbMain.pack_start( view, True, True, 0 )

Un autre point : le vbox ne s'affichera pas encore, il faut appeller la fonction show de celui-ci. Ou tout simplement écrire :

    dialog.show_all()

qui appellera show sur toute ces widgets.
En ayant fait ces modifs mon code fait ce que tu demande alors cela devrait fonctionner.

Pour ta fenêtre avec les boutons, je ne peux pas t'aider parce qu'il manque l'essentiel dans le code que tu montre, à moins que je ne me souvienne plus de toutes les détails de gtk.

Dernière modification par kuh (Le 08/07/2012, à 05:18)

Hors ligne

#3 Le 08/07/2012, à 09:36

PengouinPdt

Re : Python, GTK, Dialog et TreeView

@Kuh: tu as compris le fonctionnement majeur. La Classe Window_Dialog est appelée dans une autre classe par ce bout de code ; dans cette Classe appelante .

        WD = Window_Dialog( self.files )
        WD.set_debug( self.debug )
        WD.set_log( self.log )
        WD.run()

En fait, je suis entrain de modifier mon application "Hashable Calculator" pour permettre la gestion de plusieurs fichiers. Attention, le code qui est lisible sur mon site web n'inclut pas mes modifications pour la gestion de plusieurs fichiers.

La classe qui appelle 'WD' est ma classe 'Window_Glade', tout particulièrement la méthode build_mssg_calcul qui est transformée ainsi (cf, voir la classe "Window_Glade modifiée, affichée sur pastebin) !

Bon quoiqu'il en soit, j'ai modifié ma classe "Window_Dialog", en la modifiant ainsi : pastebin, mais ça fait exactement le même affichage "buggé", si je puis parler ainsi.

Dernière modification par PengouinPdt (Le 08/07/2012, à 13:09)


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne

#4 Le 08/07/2012, à 14:10

kuh

Re : Python, GTK, Dialog et TreeView

Je crois que la deuxième fenêtre qui s'affiche est la fenêtre Window_Message appelé dans Window_Glade à la ligne 477, c'est-à-dire après que 460 a été exécuté pour afficher la fenêtre calcul. Alors on règlera son cas plus tard.

Si je comprend bien tu veux que le TreeView s'affiche dans la première. Alors voici il y a une petite erreur qui fait que cela ne marche pas. La fonction self.dialog.show_all() doit être appelé avant le self.dialog.run(). Le run affiche la fenêtre, mais il n'y a rien à afficher. Ensuite on show tout, mais on n'affiche plus la fenêtre. Juste inverser ces deux lignes et décommenter. Et cela doit marcher.

        self.dialog.show_all()
        self.dialog.run()

Commentaire : Pourqoui tu met un vbox dans un vbox? Je m'explique tu écris

        self.vbMain.pack_start( self.view, True, True, 0 )
        self.dialog.vbox.pack_start( self.vbMain, True, True, 0 )

alors que self.dialog.vbox est une vbox : la ligne self.dialog.vbox.pack_start( self.view, True, True, 0 ) devrait être suffisant.

Hors ligne

#5 Le 08/07/2012, à 21:20

PengouinPdt

Re : Python, GTK, Dialog et TreeView

@kuh: merci, cela m'a permis de débloquer la situation, et donc d'avancer ;-)


Ego ~
YUP.py :: Yet Uploader Pixxie.py :: script python : post d'images sur forum !

Hors ligne