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+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 chevronné 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 : 30
    Localisation : France, Paris (Île de France)

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

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

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

  3. #3
    Membre éclairé 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
    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 chevronné 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 : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    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 éclairé 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
    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 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    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 confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    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.

  8. #8
    Membre chevronné 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 : 30
    Localisation : France, Paris (Île de France)

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

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

    PS: Pardon, je suis curieux.

  9. #9
    Membre éclairé 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
    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 éclairé 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
    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 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    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 éclairé 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
    Par défaut
    si je n'utilise pas le exec comment alors j'exécute le cp?

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    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...

  14. #14
    Membre éclairé 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
    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?

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 117
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    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 : 411
Taille : 9,4 Ko

    Je ne pourrai pas aider plus, encore une fois je ne connais pas gtk.

  16. #16
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    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.

  17. #17
    Membre chevronné 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 : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut
    Tout d'abord, désolé si je m'incruste ^^
    Ensuite. Je pense que son prof voulais qu'ils utilisent l'object TProcess dans l’exercice.

    Mais je reste sur mon interrogation qui est : comment utiliser les pipelines pour faire communiquer des programmes: Le titre c'est bien "récupérer affichage shell dans une fenetre GTK" (Sous entendu dans le but de prendre une décision)

    @Flodelarab
    Si j’enlève l'option -i comment j’obtiens le warning "cp : voulez-vous écraser «destination.txt» ?" (ou en anglais "cp : Do you want to overwrite «destination.txt» ?") ou encore "cp : voulez-vous écraser «destination.txt» en outrepassant le mode 0444 (r--r--r--) ?"

    Bref, j'ai l'impression que mon bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cp -i source.txt destination.txt | ./my_gtk_confirmation
    n'est pas la bonne direction...

    Quelqu'un sais comment faire se genre de chose ?

  18. #18
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    2 remarques:

    • Je n'ai pas dit d'enlever "-i" mais de le remplacer par "-f". Si ton cp est configuré pour demander par défaut une confirmation, le fait de mettre ou de ne pas mettre -i ne change rien. Il faut explicitement indiquer "-f". Il force la copie sans confirmation.
    • La commande cp ne renvoie rien. Donc, mettre un pipe qui va récupérer la sortie de cp, pour le traiter, comme si c'était un fichier texte, sans utiliser de fichier temporaire, ne sert à rien.

+ Répondre à la discussion
Cette discussion est résolue.

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