+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 10
    Points : 4
    Points
    4

    Par défaut lablgtk2 Ouvrir et afficher une image

    Bonjour,

    Je voudrais ouvrir et afficher une image dans un pack.

    Pour cela, j'ai le code suivant :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let affiche btn =
    	match btn with
    		|Some n -> ignore (GMisc.image
    		~file: n
    		~packing:(vbox#pack ~expand:false) ())
    		| _ -> raise IsNone
    
    let button = 
      let btn = GFile.chooser_button
    		~title:"Browse"
        ~action:`OPEN
        ~packing:(item#add) () in
      btn#connect#selection_changed (affiche btn#filename);
      btn
    Je pensais que ça marcherait, mais j'ai l'erreur suivante :

    Error: This expression has type string option/11
    but an expression was expected of type string option/1031
    Je n'avais jamais vu ce type d'erreur avant...

  2. #2
    Membre Expert
    Avatar de Cacophrene
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 1 031
    Points
    1 031

    Par défaut

    Bonjour,

    Error: This expression has type string option/11 but an expression was expected of type string option/1031
    Cette erreur apparaît dans l'interpréteur. Les nombres qui suivent le type string option indiquent que tu as redéfini une partie des fonctions qui ne marchaient pas, mais pas toutes, de sorte que "plusieurs types" portent le même nom (en fait un seul semble-t-il dans le cas présent, mais OCaml n'a aucun moyen de le garantir). Une solution toute simple consiste à fermer l'interpréteur de commandes et à relancer une session toute neuve.

    Concernant ton code LablGTK, je te donne une version fonctionnelle ci-dessous. Note que l'on préfère généralement créer le widget GMisc.image une seule fois, et ensuite mettre son contenu à jour. Ta fonction affiche peut être grandement simplifiée en utilisant la fonction auxiliaire Gaux.may disponible dans la bibliothèque. Enfin, petit détail, on essaie souvent d'éviter de lever des exceptions en cas d'annulation, il suffit de ne rien faire (mais je ne connais pas ton programme entier et tu as peut-être de bonnes raisons de lever une exception quand affiche reçoit None) :

    Code :
    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
    let window =
      GMain.init ();
      let window = GWindow.window
        ~title:"GMisc.image example"
        ~width:640 ~height:480
        ~position:`CENTER () in
      window#connect#destroy GMain.quit;
      window
        
    let container = GPack.vbox
      ~spacing:5
      ~border_width:5
      ~packing:window#add ()
    
    let button = GFile.chooser_button
      ~title:"Browse"
      ~action:`OPEN
      ~packing:container#add ()
    
    let image = GMisc.image 
      ~width:560 ~height:400
      ~packing:(container#pack ~expand:false) ()
    
    let _ =
      let display = Gaux.may ~f:image#set_file
      button#connect#selection_changed (fun () -> display button#filename);
      window#show ();
      GMain.main ()
    N'hésite pas à demander si tu as des questions sur ce code !

    Cordialement,
    Cacophrène

  3. #3
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Merci Cacophrène pour ta réponse !

    Je ne comprends pas très bien les raisons pour lesquelles j'ai eu cette erreur. (Même après avoir avoir relancé des sessions, ça n'a pas fonctionné...)

    (Ton code à une sytaxe error à la dernière ligne quand je compile. Ca doit juste être un problème de ";")
    Je vois comme tu veux faire. C'est vrai que du coup, je ne définis qu'une fois l'image, c'est vraiment bien.

    Je suis peut-être un peu pénible, mais est-ce que mon code ne pourrait pas marcher ? (Même si je vais utiliser le tiens qui est quand même beaucoup mieux. Mais j'aime comprendre pourquoi ça ne marche pas ^^" .)

    Merci beaucoup en tout cas.

  4. #4
    Membre Expert
    Avatar de Cacophrene
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 1 031
    Points
    1 031

    Par défaut

    Bonsoir,

    Effectivement, je n'ai pas fait attention en copiant, mon code ne fonctionne pas car il manque un in à la ligne let display = Gaux.may ~f:image#set_file.

    Concernant ton code, aurais-tu la version complète, avec la fenêtre et tout le reste, pour voir exactement ce qui ne va pas ? Avec ces deux fonctions le comportement n'est pas reproductible.

    Cordialement,
    Cacophrène

  5. #5
    Invité de passage
    Inscrit en
    novembre 2012
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : novembre 2012
    Messages : 10
    Points : 4
    Points
    4

    Par défaut

    Bonsoir,

    Voici mon code (avant que tu ne répondes au topic) : http://pastebin.com/2PMRWUcT

    Je mets le sujet en résolu puisque tu as résolu mon problème.

    J'aurais juste une dernière question : Y'a t-il (j'ai cherché dans la doc mais je n'ai pas trouvé) un moyen de connaître le chemin de l'image que contient GMisc.image ? Par exemple un genre de image#getfilename ? Si non, y'aurai t-il une manière judicieuse de stocker le chemin de mon image pour m'en resservir (sachant que le type string option ne me convient pas, je voudrais juste un string...) ?

  6. #6
    Membre Expert
    Avatar de Cacophrene
    Inscrit en
    janvier 2009
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : janvier 2009
    Messages : 533
    Points : 1 031
    Points
    1 031

    Par défaut

    Bonsoir,

    Pourquoi redéfinis-tu le type 'a option dans ton code ? Tes problèmes viennent sans doute de là. Il s'agit d'un type déjà défini dans OCaml, tu n'as pas besoin de le redéfinir.

    Il semblerait que GMisc.image ne permette pas de retrouver le nom du fichier affiché. Les possibilités de stockage sont nombreuses et dépendent beaucoup du nombre de fonctions amenées à utiliser ce fichier. Tu peux trouver pratique de le stocker dans une référence globale visible par presque tout ton code, ou au contraire de laisser ça au niveau local. C'est un peu au cas par cas.

    Cordialement,
    Cacophrène

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •