Bonjour,
J'essaie d'apprendre à utiliser Labltk sous Ocaml.
Je souhaite faire une petite calculette avec une interface graphique.
Cependant j'ai quelque problème sur la partie qui doit afficher le nombre qu'on entre.
Voilà mon code :
Mais lorsque je lance le programme, si je clique sur le button 0, il m'affiche bien 0, mais je clique une seconde fois, ça ne fait de plus.
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 open Tk;; let concat s t = (*Concatène 2 string : string -> sting -> string *) let i = (String.length s) and j = (String.length t) in if i = 0 then t else if j = 0 then s else let u = String.make (i + j) 'a' in for k = 0 to (i - 1) do u.[k] <- s.[k] done; for k = i to (i + j - 1) do u.[k] <- t.[k - i] done; u;; let affiche k res () = (* Affiche le string "k" dans le frame "res" *) Label.configure res ~text:k;; let out = ref "";; (* Initialise la sortie à la chaîne vide "" *) let init_win () = let root = Tk.openTk () in (* Frame principale *) let frame_out = Frame.create root in (* Frame de sortie *) let output = Label.create frame_out ~height:3 ~relief:`Sunken in (* La sortie *) let frame_0 = Frame.create root in (* Frame pour les bouttons *) let btt_0 = Button.create frame_0 ~width:5 ~text:"0" ~command:( out := (concat "0" !out); affiche !out output) in (* Button 0, rajoute "0" sur la sortie et affiche la sortie *) let btt_1 = Button.create frame_0 ~width:5 ~text:"1" ~command:( out := (concat "1" !out); affiche !out output) in (* Button 1, rajoute "1" sur la sortie et affiche la sortie *) pack [frame_out;frame_0] ~side:`Top ~expand:true ~fill:`X ; pack [output] ~side:`Left ~expand:true ~fill:`X ; pack [btt_0;btt_1] ~side:`Left ~expand:true ~fill:`X ; mainLoop () ;; init_win();;
Je soupçonne l'initialisation
d'être à l'origine de ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 let out = ref "";;
Je suppose que la fonctionne mainLoop() relance le programme en entier, je me trompe?
J'ai donc fait une seconde version, où au lieu de mettre la valeur de sortie dans un vecteur, je le met dans un fichier externe. Et la place de l'initialisation, j'ouvre en lecture les données du fichier externe. Donc la boucle de la fonction mainLoop(), n'efface plus la sortie. Mais je me retrouve avec exactement le même problème, quand j'appuie plusieurs fois sur 0, ça ne fait rien.
Mais ce que je trouve le plus étrange c'est que si je clique sur le button 1, il m'affiche toujours 10, mais lorsque je n'ai encore jamais clique sur le button 0.
Pouvez-vous, m'éclairer sur mon petit problème?
Merci d'avance.
Partager