Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/12/2012, 15h14   #1
Ranfan
Invité de passage
 
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 3
Points : 3
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...
Ranfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 10h26   #2
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonjour,

Citation:
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
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 12h02   #3
Ranfan
Invité de passage
 
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 3
Points : 3
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.
Ranfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 19h31   #4
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
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
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2012, 20h06   #5
Ranfan
Invité de passage
 
Inscription : novembre 2012
Messages : 10
Détails du profil
Informations forums :
Inscription : novembre 2012
Messages : 10
Points : 3
Points : 3
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...) ?
Ranfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 20h52   #6
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
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
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h31.


 
 
 
 
Partenaires

Hébergement Web