[progliste] Re: WxPython et touches du clavier
Hello Abdel, Thanks again. en complément de ton message, j'ai ressorti un des "tutos" que j'ai sur WxPython, dont le titre est : Programmer des interfaces graphiques avec le framework open source wxPython - Club d'entraide des développeurs francophones Je n'ai pas d'URL car je ne l'ai qu'en local. Il insiste, au moins au début, sur la manière d'exploiter la doc de WXWidgets en montrant comment les en-têtes de classes C++ se transposent en WxPython. C'est le premier tuto que j'avais récupéré. Pas forcément le plus facile, mais qui prend plutôt de" la valeur avec le temps. Bonne soirée, J.-F. Le 16/05/2017 18:50, Abdel a écrit : De rien JF, Pour connaitre les différentes méthodes et attributs des objets du module wx, je te propose ce qui suit : Comme du côté de chez NVDA, le module wx est intégré, il te suffit d'ouvrir la console Python de NVDA avec NVDA + Contrôle + Z. Ensuite, inutile d'importer le module wx, il est importé par défaut dans la console. Tape wx, suivi d'un point, puis réalise 2 tabulations. La liste complète des méthodes et attributs du module wx devrait s'afficher devant toi, tu pourras circuler à l'intérieur avec tes flèches verticales. Cette liste reconnait également lâauto complétion, c'est à dire que si tu écrit wx.WXK et que tu tabules 2 fois, tu auras toute la liste des constantes des touches intégrées dans le module. Si parmi toutes ces méthodes et attributs, il y en a une qui retient ton attention, valide sur entrée pour l'insérer, puis help(taLigne) pour consulter l'aide. Pour avoir les méthodes et attributs de la classe wx.Frame, tape simplement wx.Frame, suivi d'un point, puis 2 tabulations. Tu pourras le faire pour toute les classes du module wx ou n'importe quel autre module... Bien amicalement, Abdel. Le 15/05/2017 à 21:10, Jean-François Colas a écrit : Hello Abdel et tous, Merci pour cette page. Elle a répondu tout à fait à mon interrogation. Je n'ai pas encore appliqué sur mon code, mais le code du programme me laisse bon espoir. Après ça, faudra quand même que je me trouve du temps pour prendre en main la circulation dans la doc Wx, parce que les attributs des différents objets, ne s'inventent pas... Bonne soirée, J.-F. Le 14/05/2017 11:59, Abdel a écrit : Coucou JF, Généralement, une wx.Frame est utilisée pour servir de conteneur, elle peut inclure une barre de menu, 1 ou plusieurs panels comportant à leurs tours différents Widget, etc. Le wx.Dialog est plus orienté dialogue comme son nom l'indique. Dans mon usage personnel, je n'utilise des wx.Dialog que si j'ai à faire à des commandes de formulaires, comme des case à cocher, des boutons, bouton-radios, etc... Je préfère disposer ces widgets dans une wx.Dialog plutôt qu'une wx.Frame... Sinon, pour la définition d'un handler unique pour tous tes boutons, bien sûr que c'est possible ! Voici une page qui décrit la chose, in English : https://www.blog.pythonlibrary.org/2011/09/20/wxpython-binding-multiple-widgets-to-the-same-handler/ En gros, ce sera : buttons = [self.button1, self.button2] for button in buttons: self.tonHandlerUnique(button) Je n'ai pas eu le temps de le mettre en pratique pour ton exemple, mais tu peux essayer si tu veux. Voila, merci à toi. Bien amicalement, *Abdel. Le 13/05/2017 à 18:10, Jean-François Colas a écrit : Hello Abdel, Cool, je n'imaginais pas qu'on puisse traiter un dialogue comme une frame: quelles peuvent être alors les avantages d'une frame du coup, en tout cas pour une utilisation courante? Est-ce que selon toi ou vous autres, il serait possible de rendre plus générale la méthode parcourir1 de sorte qu'elle puisse être associée à deux boutons différents, que je puisse savoir lequel a provoqué l'appel de cette procédure pour agir en conséquence? Vu que c'est quasi le même code à l'exception de quelques 2 à laplace de 1 lol? Bon je reverrai tout ça un peu plus en détail lorsque j'aurai du braille sous les doigts... Bonne soirée, J.-F. Le 12/05/2017 23:31, Abdel a écrit : Coucou JF, Tu as fait du beau boulot, et j'ai de bonnes nouvelles pour toi, en matière de simplification du code. Comme tu l'as bien compris, il est vrai que l'on ne peut avoir une navigation tabulaire dans une wxFrame, que si l'on insère nos widgets dans un panel, ou que l'on utilise le style wx.TAB_TRAVERSAL dans notre Frame. C'est vrai pour la wx.Frame, mais pas pour la wx.Dialog ! Dans une wx.Dialog, la navigation tabulaire est déja comprise par défaut. Donc, c'est un premier avantage. Second avantage pour la wx.Dialog, c'est qu'elle nous épargne le fait de devoir se casser la tête à associer des événements pour la touche escape, le fait de disposer d'un bouton annuler avec sa méthode appropriée suffit pour que la wx.Dialog associe la fermeture à la touche escape, où que l'on soit dans celle-ci. Donc, encore pas mal de li
[progliste] Re: WxPython et touches du clavier
De rien JF, Pour connaitre les différentes méthodes et attributs des objets du module wx, je te propose ce qui suit : Comme du côté de chez NVDA, le module wx est intégré, il te suffit d'ouvrir la console Python de NVDA avec NVDA + Contrôle + Z. Ensuite, inutile d'importer le module wx, il est importé par défaut dans la console. Tape wx, suivi d'un point, puis réalise 2 tabulations. La liste complète des méthodes et attributs du module wx devrait s'afficher devant toi, tu pourras circuler à l'intérieur avec tes flèches verticales. Cette liste reconnait également lâauto complétion, c'est à dire que si tu écrit wx.WXK et que tu tabules 2 fois, tu auras toute la liste des constantes des touches intégrées dans le module. Si parmi toutes ces méthodes et attributs, il y en a une qui retient ton attention, valide sur entrée pour l'insérer, puis help(taLigne) pour consulter l'aide. Pour avoir les méthodes et attributs de la classe wx.Frame, tape simplement wx.Frame, suivi d'un point, puis 2 tabulations. Tu pourras le faire pour toute les classes du module wx ou n'importe quel autre module... Bien amicalement, Abdel. Le 15/05/2017 à 21:10, Jean-François Colas a écrit : Hello Abdel et tous, Merci pour cette page. Elle a répondu tout à fait à mon interrogation. Je n'ai pas encore appliqué sur mon code, mais le code du programme me laisse bon espoir. Après ça, faudra quand même que je me trouve du temps pour prendre en main la circulation dans la doc Wx, parce que les attributs des différents objets, ne s'inventent pas... Bonne soirée, J.-F. Le 14/05/2017 11:59, Abdel a écrit : Coucou JF, Généralement, une wx.Frame est utilisée pour servir de conteneur, elle peut inclure une barre de menu, 1 ou plusieurs panels comportant à leurs tours différents Widget, etc. Le wx.Dialog est plus orienté dialogue comme son nom l'indique. Dans mon usage personnel, je n'utilise des wx.Dialog que si j'ai à faire à des commandes de formulaires, comme des case à cocher, des boutons, bouton-radios, etc... Je préfère disposer ces widgets dans une wx.Dialog plutôt qu'une wx.Frame... Sinon, pour la définition d'un handler unique pour tous tes boutons, bien sûr que c'est possible ! Voici une page qui décrit la chose, in English : https://www.blog.pythonlibrary.org/2011/09/20/wxpython-binding-multiple-widgets-to-the-same-handler/ En gros, ce sera : buttons = [self.button1, self.button2] for button in buttons: self.tonHandlerUnique(button) Je n'ai pas eu le temps de le mettre en pratique pour ton exemple, mais tu peux essayer si tu veux. Voila, merci à toi. Bien amicalement, *Abdel. Le 13/05/2017 à 18:10, Jean-François Colas a écrit : Hello Abdel, Cool, je n'imaginais pas qu'on puisse traiter un dialogue comme une frame: quelles peuvent être alors les avantages d'une frame du coup, en tout cas pour une utilisation courante? Est-ce que selon toi ou vous autres, il serait possible de rendre plus générale la méthode parcourir1 de sorte qu'elle puisse être associée à deux boutons différents, que je puisse savoir lequel a provoqué l'appel de cette procédure pour agir en conséquence? Vu que c'est quasi le même code à l'exception de quelques 2 à laplace de 1 lol? Bon je reverrai tout ça un peu plus en détail lorsque j'aurai du braille sous les doigts... Bonne soirée, J.-F. Le 12/05/2017 23:31, Abdel a écrit : Coucou JF, Tu as fait du beau boulot, et j'ai de bonnes nouvelles pour toi, en matière de simplification du code. Comme tu l'as bien compris, il est vrai que l'on ne peut avoir une navigation tabulaire dans une wxFrame, que si l'on insère nos widgets dans un panel, ou que l'on utilise le style wx.TAB_TRAVERSAL dans notre Frame. C'est vrai pour la wx.Frame, mais pas pour la wx.Dialog ! Dans une wx.Dialog, la navigation tabulaire est déja comprise par défaut. Donc, c'est un premier avantage. Second avantage pour la wx.Dialog, c'est qu'elle nous épargne le fait de devoir se casser la tête à associer des événements pour la touche escape, le fait de disposer d'un bouton annuler avec sa méthode appropriée suffit pour que la wx.Dialog associe la fermeture à la touche escape, où que l'on soit dans celle-ci. Donc, encore pas mal de ligne en moins... Je te joins en PJ, ton code avec ta wx.Frame transformée en wx.Dialog, dis-moi ce que tu en penses. Ne rigole pas pour le nom de la classe principale, MonPtitDialog, lol ! Voila, merci pour ta passion pour le Python et le wxPython, je suis un passionné également. Bien amicalement, Abdel. Le 12/05/2017 à 21:20, Jean-François Colas a écrit : Hello tous, Oui, après tout, pourquoi pas vous faire part de mon petit amusement... Pas par sagesse, oh non lol. J'avais trois objectifs avec ce petit truc en PJ. L'un étant de construire une petite interface pour sélectionner deux fichiers, dont les noms à terme sont voués à être
[progliste] Re: javascript convertir un nombre en toutes lettres
Merci Yannick, même si on ne s'en sert pas tout de suite, on stocke au cas où... Serge -- From: "Yannick Youalé" Sent: Tuesday, May 16, 2017 12:11 PM To: Subject: [progliste] javascript convertir un nombre en toutes lettres Salut les mecs, Je vous propose un code javascript de convertion de nombre en toutes lettres. Certes pour les DV l'intérêt est limité car nos logiciels de synthèse vocale nous lisent déjà correctement les nombres, mais pour ceux qui ont des pages de facturations ou simplement des champs d'affichage de montant en argent sur leurs sites, ils pourraient y trouver une utilité. Il y a de cela quelques siècles, j'avais proposé une version de ce code en VBA, que j'ai bien évidemment amélioré depuis. J'aurais bien aimé encapsuler ces fonctions dans une classes, mais le javascript ne le permet pas en natif. Donc, il s'agit d'un groupe de fonctions dont celle que vous utiliserez le plus sera ConvertNumber. Attention voici le code: Début du code javascript // code permettant de convertir un nombre en toutes lettres // prend en compte les décimales // limité à 999 999 999 999 999 soit aux trillions // la seule fonction à utiliser est ConvertNumber(sNumber function ConvertUnit(sNumber){ // convertit un chiffre isolé var tbl; // On Error Resume } // Next tbl = new Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf"); return tbl[parseInt(sNumber)]; } // end function function ConvertTen(sNumber){ // convertit un nombre dans les dizaines var tbl; tbl = new Array("", "dix", "vingt", "trante", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix"); return tbl[parseInt(sNumber)]; } // end function function ConvertTenSpecial(sNumber){ // les nombres spéciaux de la langue française // renvoi chaîne vide si aucune équivalance var s; var i1; var i2; s = ""; i1 = sNumber.substring(0, 1); i2 = sNumber.substring(1, 2); switch (i1) { case "1": case "7": case "9": if(i2 == "1"){ if (i1 != "1"){ s = ConvertTen(i1 - 1); } s = s + " onze"; } else if(i2 == "2"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " douze"; } else if(i2 == "3"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " treize"; } else if(i2 == "4"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " quatorze"; } else if(i2 == "5"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " quinze"; } else if(i2 == "6"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " seize"; } // end if } // end select // renvoi return s.trim(); } // end function function ConvertHundred(sNumber){ // convertit un nombre limité à la centaine var i; var s = ""; var sHundred; var sTen; var sTenSpecial; var sUnit; // ajout de 0 si nécessaire i = 3 - sNumber.length; if (i > 0){ sNumber = "0".repeat(i) + sNumber; } // vérification if(sNumber == "000"){ return ""; } // fin si // centaine sHundred = sNumber.substring(0, 1); // dizaine sTen = sNumber.substring(1, 2); // unité sUnit = sNumber.substring(2, 3); // centaine if (sHundred != "0"){ if (sHundred == "1"){ s = "cent"; } else { s = ConvertUnit(sHundred) + " cents"; } // end if } // end if ' fin des centaines // dizaine // vérification si dizaine spéciale sTenSpecial = ConvertTenSpecial(sNumber.substring(1, 3)); if (sTenSpecial != ""){ s = s + " " + sTenSpecial; } else { // si dizaine normale if (sTen != "0"){ s = s + " " + ConvertTen(sTen); } // end if ' fin des dizaines // unité if (sTen != "0" && sUnit == "1"){ s = s + " et"; } if (sUnit == "1"){ s = s + " " + ConvertUnit(sUnit); } else if(sUnit != "0"){ s = s + "-" + ConvertUnit(sUnit); } // end if } // end if ' fin si dixaine spéciale ou pas // renvoi s = s.trim(); return s; } // end function function ConvertIntegerNumber(sNumber){ // convertit un nombre entier en toutes lettres. var i; var s; var s2; var sHundred; // vérification si numérique // sNumber = sNumber.trim(); sNumber = sNumber.replace(" ", ""); if (isFinite(sNumber) == false){ return ""; } // end if // on complète avec des 0 // jusqu'à la longueur maximale // qui est de 999 trillions. // ce qui fait au maximum 15 caractères i = 15 - sNumber.length; // exception if (i < 0){ return ""; } // end if sNumber = "0".repeat(i) + sNumber; // s'il n'y a que des zéro if(sNumber.match("^[0]+$")){ return "zéro"; } // fin si // parcours des cinq branches de trois caractères // tout en complétant le texte résultat s = ""; for(i=1; i<=5; i++){ sHundred = sNumber.substring((i - 1) * 3, ((i - 1) * 3) + 3); s2 = ConvertHundred(sHundred); // selon la branche switch (i) { case 1: // trillion if (s2 != ""){ s = s + " " + s2 + " trillion"; // si pluriel if (s2 != "un"){ s = s + "s"; } } // end if break; case 2: // milliard if (s2 != ""){ s = s + " " + s2 + " milliard"; // si pluriel if (s2 != "un"){ s = s + "s"; } } // end if break; case 3: // million if (s2 != ""){ s = s + " " +
[progliste] javascript convertir un nombre en toutes lettres
Salut les mecs, Je vous propose un code javascript de convertion de nombre en toutes lettres. Certes pour les DV l'intérêt est limité car nos logiciels de synthèse vocale nous lisent déjà correctement les nombres, mais pour ceux qui ont des pages de facturations ou simplement des champs d'affichage de montant en argent sur leurs sites, ils pourraient y trouver une utilité. Il y a de cela quelques siècles, j'avais proposé une version de ce code en VBA, que j'ai bien évidemment amélioré depuis. J'aurais bien aimé encapsuler ces fonctions dans une classes, mais le javascript ne le permet pas en natif. Donc, il s'agit d'un groupe de fonctions dont celle que vous utiliserez le plus sera ConvertNumber. Attention voici le code: Début du code javascript // code permettant de convertir un nombre en toutes lettres // prend en compte les décimales // limité à 999 999 999 999 999 soit aux trillions // la seule fonction à utiliser est ConvertNumber(sNumber function ConvertUnit(sNumber){ // convertit un chiffre isolé var tbl; // On Error Resume } // Next tbl = new Array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf"); return tbl[parseInt(sNumber)]; } // end function function ConvertTen(sNumber){ // convertit un nombre dans les dizaines var tbl; tbl = new Array("", "dix", "vingt", "trante", "quarante", "cinquante", "soixante", "soixante-dix", "quatre-vingt", "quatre-vingt-dix"); return tbl[parseInt(sNumber)]; } // end function function ConvertTenSpecial(sNumber){ // les nombres spéciaux de la langue française // renvoi chaîne vide si aucune équivalance var s; var i1; var i2; s = ""; i1 = sNumber.substring(0, 1); i2 = sNumber.substring(1, 2); switch (i1) { case "1": case "7": case "9": if(i2 == "1"){ if (i1 != "1"){ s = ConvertTen(i1 - 1); } s = s + " onze"; } else if(i2 == "2"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " douze"; } else if(i2 == "3"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " treize"; } else if(i2 == "4"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " quatorze"; } else if(i2 == "5"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " quinze"; } else if(i2 == "6"){ if (i1 != "1"){ s = ConvertTen("" + (parseInt(i1) - 1) + ""); } s = s + " seize"; } // end if } // end select // renvoi return s.trim(); } // end function function ConvertHundred(sNumber){ // convertit un nombre limité à la centaine var i; var s = ""; var sHundred; var sTen; var sTenSpecial; var sUnit; // ajout de 0 si nécessaire i = 3 - sNumber.length; if (i > 0){ sNumber = "0".repeat(i) + sNumber; } // vérification if(sNumber == "000"){ return ""; } // fin si // centaine sHundred = sNumber.substring(0, 1); // dizaine sTen = sNumber.substring(1, 2); // unité sUnit = sNumber.substring(2, 3); // centaine if (sHundred != "0"){ if (sHundred == "1"){ s = "cent"; } else { s = ConvertUnit(sHundred) + " cents"; } // end if } // end if ' fin des centaines // dizaine // vérification si dizaine spéciale sTenSpecial = ConvertTenSpecial(sNumber.substring(1, 3)); if (sTenSpecial != ""){ s = s + " " + sTenSpecial; } else { // si dizaine normale if (sTen != "0"){ s = s + " " + ConvertTen(sTen); } // end if ' fin des dizaines // unité if (sTen != "0" && sUnit == "1"){ s = s + " et"; } if (sUnit == "1"){ s = s + " " + ConvertUnit(sUnit); } else if(sUnit != "0"){ s = s + "-" + ConvertUnit(sUnit); } // end if } // end if ' fin si dixaine spéciale ou pas // renvoi s = s.trim(); return s; } // end function function ConvertIntegerNumber(sNumber){ // convertit un nombre entier en toutes lettres. var i; var s; var s2; var sHundred; // vérification si numérique // sNumber = sNumber.trim(); sNumber = sNumber.replace(" ", ""); if (isFinite(sNumber) == false){ return ""; } // end if // on complète avec des 0 // jusqu'à la longueur maximale // qui est de 999 trillions. // ce qui fait au maximum 15 caractères i = 15 - sNumber.length; // exception if (i < 0){ return ""; } // end if sNumber = "0".repeat(i) + sNumber; // s'il n'y a que des zéro if(sNumber.match("^[0]+$")){ return "zéro"; } // fin si // parcours des cinq branches de trois caractères // tout en complétant le texte résultat s = ""; for(i=1; i<=5; i++){ sHundred = sNumber.substring((i - 1) * 3, ((i - 1) * 3) + 3); s2 = ConvertHundred(sHundred); // selon la branche switch (i) { case 1: // trillion if (s2 != ""){ s = s + " " + s2 + " trillion"; // si pluriel if (s2 != "un"){ s = s + "s"; } } // end if break; case 2: // milliard if (s2 != ""){ s = s + " " + s2 + " milliard"; // si pluriel if (s2 != "un"){ s = s + "s"; } } // end if break; case 3: // million if (s2 != ""){ s = s + " " + s2 + " million"; // si pluriel if (s2 != "un"){ s = s + "s"; } } // end if break; case 4: // millier if (s2 != ""){ if (s2 == "un"){ s = s + " mille"; } else { s = s + " " + s2 + " mille"; } // end if // si pluriel if (s