IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

récupérer affichage shell dans une fenetre GTK


Sujet :

GTK+

  1. #1
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut récupérer affichage shell dans une fenetre GTK
    j'ai une commande qui retourne un affichage de confirmation sur le shell, comment est ce que je pourrai le recevoir dans un msg box gtk?

  2. #2
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Bonsoir,

    Tu aurais peut-être un petit bout de code à nous montrer ?

  3. #3
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    alors j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execl("bin\cp","cp","-i",path,destination);
    ce code permet de copier un fichier avec l'exécution de la commande shell CP mais sous programme C, et l'argument "-i" pour le overwrite, si le fichier existe il te prévient avant écrasement, alors je veux récupérer ce message dans une fenetre avec OK ou Annuler car ce code est dans une application en GTK

  4. #4
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    En mode console ça risque de poser problème parce que la fenêtre gtk ne pourra pas s'ouvrir.

    Tu pourrais utiliser les fonction Glib File Utilities pour copier un fichier au lieu d'utiliser exec...

    Sinon, je ne vois pas trop, peut être en rediriger la sortie standard. Mais ça t'obligerai a parsser le prompt de la console et avec l'internationalisation ca risque d'être chaud...

  5. #5
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    le prof a exigé d'utiliser exec car il s'agit d'un tp systeme d'exploitation

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Si tu ne peux pas faire autrement qu'utiliser exec(); alors la seule solution est d'écrire la sortie de la fonction dans un fichier sur le disque.

    Tu lis ensuite ce fichier depuis Gtk+ et tu affiches son contenu.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Salut,

    je me mêle sans doute de ce qui ne me regarde pas, mais ne pourrait-on pas passer par des tubes nommés ? il y a un chapitre entier dans mon vieux "Programmation Linux" chez Eyrolles, et ce qui m'a fait penser à ça c'est que je code en Lazarus et que pour récupérer les sorties de commandes du shell j'utilise un objet TProcess dont l'une des options s'appelle poUsePipes.

    Exemple d'utilisation (en Pascal) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    function ExecuteET(const ETcmd: string; cmdline: TStrings): Boolean;
    const
      READ_BYTES = 2048;
    var
      BytesRead: DWORD;
      Stream: TMemoryStream;
      NumBytes: LongInt;
      aProcess: TProcess;
      Res: integer;
    begin
      Res := 0;
      Result := False;
      try
        // http://wiki.lazarus.freepascal.org/Executing_External_Programs
        aProcess := TProcess.Create(nil);
        aProcess.Executable:= ETcmd;
        aProcess.Parameters.AddStrings(cmdline);
        aProcess.Options := [poUsePipes, poDefaultErrorMode];
        aProcess.Execute;
      except
        Exit;
      end;
      if Res <> aProcess.ExitStatus then Result := True;
     
      // Get output written by shell command:
      ETout.Clear; // ETout est un objet TStringList
      BytesRead := 0;
      Stream := TMemoryStream.Create;
      try
        while True do
        begin
          // make sure we have room
          Stream.SetSize(BytesRead + READ_BYTES);
          // try reading it
          NumBytes := aProcess.Output.Read((Stream.Memory + BytesRead)^, READ_BYTES);
          if NumBytes > 0 // All read() calls will block, except the final one.
          then Inc(BytesRead, NumBytes)
          else BREAK // Program has finished execution.
        end;
        if BytesRead > 0 then
        begin
          Stream.SetSize(BytesRead);
          ETout.LoadFromStream(Stream);
        end;
      finally
        Stream.Free;
      end;
    end;
    Il suffirait donc de créer un tube nommé, d'y envoyer la sortie de la commande shell, et le programme gtk n'aura plus qu'à y aller pour la lire.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Hind4Dev tu pourrais nous montré l'énoncé ?

    PS: Pardon, je suis curieux.

  9. #9
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    alors Jipété ta solution je pense m'est la plus favorable car utiliser un tube fait vraiment partie de mon programme système, veux tu bien m'expliquer plus STP

  10. #10
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    Gaulouis en ce qui est de l'énoncé est de créer un copier linux en utilisant des fonctions systèmes qu'on a vu selon le besoin sur linux et avec interface graphique en C, j'ai fini la copie maintenant pour ce qui est de la demande de confirmation d’écrasement en cas où le fichier existe déjà dans la cible, j'ai besoin de récupérer le message du shell

  11. #11
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Effectivement la solution est de passer par des pipes. Mais vu que tu es obligé d'utiliser exec(); je ne vois pas comment cela peut être possible.

    Une autre manière "plus simple" serait d'utiliser popen();. Ca permet de récupérer la sortie standard du programme exécuté.

    Sinon, comme décrit dans le man de popen, ton prof. te demande de réinventer la roue en utilisant un fork(); avec un pipe();.

  12. #12
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    si je n'utilise pas le exec comment alors j'exécute le cp?

  13. #13
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    si je n'utilise pas le exec comment alors j'exécute le cp?
    Au vu de ta réponse il semblerait donc possible d'utiliser d'autres fonctions que exec(); ? Si c'est oui popen(); te permet d'exécuter une commande et de récupérer dans un descripteur de fichier la sortie standard de la dite commande. En voila un exemple http://www.infres.enst.fr/~dax/polys/tp-c-shell/#popen

  14. #14
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    est ce que je peux écrire la commande comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File * popen("cp -i","w");
    et où est ce que je met le path et la destinantion de la copie?
    et comment récupérer par gtk le message et renvoyer la décision de l'utilisateur?
    tout ça me parait un peux vague, pourriez vous m'expliquer, SVP?

  15. #15
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Malheureusement tu ne peux pas écrire et lire en même temps avec cette fonction. Lorsque tu l'exécutes, le deuxième argument te permet d'indiquer que tu ouvres un tunnel soit en lecture, soit en écriture.

    En reprenant le code exemple du lien que je t'ai donné tu devrais déjà pouvoir commencer à avoir un début de solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FILE *pp;
     
    if ((pp = popen("ps aux", "r") == NULL)
    {
      perror("popen"); exit(1);
    }
     
    while (fgets(buf, sizeof(buf), pp))
      fputs(buf, stdout);
     
    pclose(pp);

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Hind4Dev Voir le message
    alors Jipété ta solution je pense m'est la plus favorable car utiliser un tube fait vraiment partie de mon programme système, veux tu bien m'expliquer plus STP
    Hé bien, je ne vais pas m'amuser à te recopier les 50 pages du chapitre 12 de mon bouquin, en plus je n'ai certainement pas le droit, par contre rien ne t'interdit de faire une recherche sur "named pipes" : tu verras, même Wipidépia en parle.

    Bonnes lectures...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Membre habitué Avatar de Hind4Dev
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2014
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2014
    Messages : 428
    Points : 140
    Points
    140
    Par défaut
    je sais ce qu'est un tube nommé mais je ne sais pas comment récupérer le message dans un msgBox GTK et comment renvoyer la décision via les boutons de cette fenêtre?

  18. #18
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Je voulais faire le même exercice que Hind4Dev mais sans l'énoncé (Purement une histoire de droit d’auteur)

    J'ai fait un script bash que j'utilise comme ca : ./script source.txt destination.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    src=$1
    dest=$2
     
    if (! (test -e $dest)) then
    	echo "pas de soucis"
    else
            # TODO check DISPLAY
    	cp $src -i $dest | ./my_gtk_prompt
    fi
    Et un GtkDialog qui devrais reprendre et afficher la sortie de la commande cp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // file main.c
    // compile: gcc main.c -o my_gtk_prompt `pkg-config --cflags --libs gtk+-2.0`
    #include <gtk/gtk.h>
    //#include <gst/gst.h>
     
    int main( int   argc,
              char *argv[] )
    {
        GtkWidget *window;
     
        gtk_init (&argc, &argv);
     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_widget_show  (window);
        g_signal_connect (window, "delete-event",
    		      G_CALLBACK (gtk_main_quit), NULL);
        gtk_window_set_title(GTK_WINDOW(window), argv[0]);// argv[1] == (null)
     
        gtk_main ();
     
    g_print("yes"); // or no
    g_print("\n");
     
        return 0; 
    }
    Dois-je utiliser GStreamer ? Ce tutoriel me permettrais t-il d'y parvenir ?

    Une autre question. Comment géré les erreur de permissions dans le GtkDialog ?

    Merci

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Salut,

    tout d'abord je tiens à préciser que je ne connais absolument pas gtk, même si Lazarus s'appuie dessus.

    Donc c'est vraiment du bricolage ce que je vais montrer, mais l'idée y est.

    Tout d'abord une petite modif dans le script d'appel, pour passer un paramètre au prog gtk dans tous les cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (! (test -e $dest)) then
    #	echo "pas de soucis"
    	./prog_gtk "pas de soucis"
    ensuite, la modification qui va bien dans prog_gtk.c (qui pour moi est prog_gtk.pas).
    Comme je ne savais pas comment faire afficher du texte dans ce prog, et que j'avais un exemple avec un Button, j'ai choisi de modifier le texte du Button :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	gtk_init (@argc, @argv) ;
    	window := gtk_window_new (GTK_WINDOW_TOPLEVEL) ;
    //	button := gtk_button_new_with_label ( 'Click_me' ) ;
    // on peut passer un paramètre au prog :
    	if argc = 1 then button := gtk_button_new_with_label ( 'Pas de paramètre' )
    	else button := gtk_button_new_with_label ( argv[1] );
    Je vous laisse retranscrire en C et le mettre là où il faut dans vos essais, en tout cas, au final, selon que j'appelle ./script source.txt destination.txt ou ./script source.txt je gagne l'un des deux affichages :
    Nom : gtk.png
Affichages : 368
Taille : 9,4 Ko

    Je ne pourrai pas aider plus, encore une fois je ne connais pas gtk.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  20. #20
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Que de nœuds au cerveau pour pas grand chose. Si la confirmation de la console te gêne, fais sauter la confirmation de la console. Et fais une confirmation dans ton interface graphique.

    Ainsi, l'option "-i" de ta commande cp sera transformée en "-f", ce qui forcera la copie, une fois la confirmation obtenue dans l'interface graphique. Si l'action est annulée, la commande n'est pas exécutée.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. affichage image dans une fenetre
    Par neolink dans le forum C++
    Réponses: 1
    Dernier message: 10/06/2009, 14h05
  2. afficher pages web dans une fenetre GTK
    Par zakos dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 03/10/2007, 21h38
  3. Double affichage OpenGL dans une meme fenetre
    Par greghass dans le forum OpenGL
    Réponses: 3
    Dernier message: 13/11/2006, 21h57
  4. Affichage d'un fichier texte dans une fenetre
    Par schwinny dans le forum Access
    Réponses: 3
    Dernier message: 11/08/2006, 08h53
  5. Probleme d'affichage d'image dans une fenetre
    Par cgregueusse dans le forum MFC
    Réponses: 1
    Dernier message: 03/08/2005, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo