Python

Bonjour à toutes et tous, j’ai un peu besoin d’aide dans ma découverte de python.

J’ai fait un petit programme qui calcule les mini / maxi d’un fichier CNC gcode, les distances d’usinage et rapide, les temps d’usinages et rapide, c’est un peu besogneux dans l’écriture mais comme je ne connais pas python, je résultat me satisfait pour un début. Le but est autant d’avoir le programme, que de voir ce que c’est que python.

Ce programme ne prend pas encore en compte les interpolations circulaires et les cycles de perçages, mais ça devrait pas être complique a rajouter. J’ai cependant un petit problème, pour le lancer j’ai fait un .bat (je suis sous windows) qui fait :

C:\Users\Pierre\AppData\Local\Programs\Python\Python38\python.exe E:\Donnees\python\projet_python\preparation_gcode\preparation_gcode.py > E:\Donnees\python\resultat\preparation.txt

Le resultat se trouve donc dans : E:\Donnees\python\resultat\preparation.txt et voivci l’exemple de ce que ca fait:

preparation.txt (1,5 Ko)

Encore une fois , c’est pas siouxe, mais ca me va. Je voudrais juste mettre un popup message a la fin du python pour rappeler ou se trouve le resultat et c’est la que ca coince. J’ai trouve un exemple auquel je ne comprend pas grand chose dans le passage des arguments (messagbox.py).

Si j’execute ce messagbox.py tout seul j’ai bien mes popup messages (infobox, message box, oui_non box etc…), mias lorsque j’integre entierement ce python dans le mien j’ai une erreur liée aux arguments et comme je ne comprends rien a cette methode d’arguments, je ne trouve pas l’erreur.

Je joins:
Le gcode de test (implantation.gcode):

implantation.gcode (7,6 Ko)

mon bout de python (preparation_gcode.py) qui fonctionne bien sauf a la fin lorsque je veux afficher un message du style « le résultat se trouve dans … » ça se plante.

Dans ce zip vous trouverez aussi le message.py qui fonctionne parfaitement lorsqu’utilisé tout seul.

preparation_gcode.zip (4,4 Ko)

Un bon point de départ pour Python de manière générale

J’ai regardé ton code et l’exemple dont tu es parti. Je n’ai rien trouvé d’évident.

Pourrais-tu poster le message d’erreur exact de l’interpréteur ?

ce message n’apparait que lorsque j’appelle

if __name__ == "__main__":

    print("info", showinfo("Spam", "Egg Information"))
    print("warning", showwarning("Spam", "Egg Warning"))
    print("error", showerror("Spam", "Egg Alert"))
    print("question", askquestion("Spam", "Question?"))
    print("proceed", askokcancel("Spam", "Proceed?"))
    print("yes/no", askyesno("Spam", "Got it?"))
    print("yes/no/cancel", askyesnocancel("Spam", "Want it?"))
    print("try again", askretrycancel("Spam", "Try again?"))

Traceback (most recent call last):
  File "E:\Donnees\python\projet_python\preparation_gcode\preparation_gcode.py", line 344, in <module>
    print("info", showinfo("Spam", "Egg Information"))
  File "E:\Donnees\python\projet_python\preparation_gcode\preparation_gcode.py", line 106, in showinfo
    return _show(title, message, INFO, OK, **options)
  File "E:\Donnees\python\projet_python\preparation_gcode\preparation_gcode.py", line 94, in _show
    res = Message(**options).show()
  File "C:\Users\Pierre\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 3403, in __init__
    Widget.__init__(self, master, 'message', cnf, kw)
  File "C:\Users\Pierre\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 2567, in __init__
    self.tk.call(
_tkinter.TclError: unknown option "-icon"

salut, tu peux essayer de faire un simple « from tkinter import messagebox »
et ensuite
"messagebox.showinfo(« Title », « le fichier se trouve blabla »)

Super ca marche merci a tous les 2

image

@ Thomas : Le MOOC commence par : Dans ce cours, vous apprendrez à bien programmer en Python.

Y aurait il un message subliminal :slight_smile:

Absolument pas :woozy_face:.

Je t’avouerai que je n’ai pas lu le texte décrivant le cours. Je suis actuellement entrain de le suivre et je le trouve bien. Je partageai juste l’information

@thomas

Merci pour le partatage, je vais m’y atteler aussi.

Bonjour à toutes et tous
Si quelqu’un peut m’aider à comprendre ce qui se passe dans ce passage d’argument

Premier cas qui fonctionne
def foo(a, b, c, d):
print(a, b, c, d)

foo(1, c=3, *(2,), **{‹ d ›:4})

1 2 3 4

Dans ce cas a=1 (positionnel)
c=3 (nommage)
d=4 par dictionnaire
b=2 par reliquat sur le tuple ==> pourquoi pas

mais le suivant le marche pas

try:

foo (1, b=3, *(2,), **{‹ d ›:4})

except Exception as e:

print(f"OOPS, {type(e)}, {e}")

OOPS, <class ‹ TypeError ›>, foo() got multiple values for argument ‹ b ›

pourquoi ne serait-ce pas pareil que le premier exemple qui marche?

Je n’ai jamais vu cette façon d’utiliser des arguments dans Python, tu as trouvé ça où ?

Mais je pense que Python assigne d’abord les arguments non nommés (1er argument non nommé 1 -> a, deuxième argument non nommé 2 (ou (2,), à vérifier) -> b, du coup quand il s’occupe des arguments nommés et qu’il trouve b=3, ça lui pose problème.

à oui merci ça doit être cela. J’ai trouvé ça dans le MOOC python dans le chapitre « passage des arguments ». Je me suis promis de ne jamais utiliser cela mais par curiosité…

En fait, et en résumé, avec Python, … rien n’est simple :wink:

Disons que le chemin du savoir serpente un petit peu :).

Bonjour, je seche encore sur un truc bete en python/html:

Je cherche a preselectionner un radio bouton. Il y a sans doute une facon + sioux, mais voici celle que j’ai trouvée (la seule a laquelle je puisse penser). J’y suis presque mais je bloque sur une chtite connerie.

Si j’ai 2 choix, ca marche
Dans le python

listes_selection= [" ", « checked »] (ou l’inverse)
dico_context = {« les autres parametres du contexte »,« Checked_sel »:listes_selection}
return render(request, « appli/index.html », {« dico »: dico_context })

dans le html

<INPUT type=« radio » name=« SENS » value=« 1 » {{dico_context .Checked_sel.0}} > Radio_1
<INPUT type=« radio » name=« SENS » value=« 0 » {{dico_context .Checked_sel.1}} > Radio_2

ca ca marche nickel. mais si je ne sais pas a l’avance combien de choix j’ai, dans le html je fais une boucle et c’est la que ca se gate.

{% for nom_truc in dico_context.liste %}
<input type=« radio » name=« liste_item » id=« liste_itemt{{ forloop.counter }} » value="{{ forloop.counter }} " {{dico_context.Checked_sel.forloop.counter}}>
{{ nom_truc }}

{% endfor %}

en fait la ou ca coince c’est : {{dico_context .Checked_sel.forloop.counter}}

si j’imprime : dico_context.Checked_sel.{{Checked_sel.forloop.counter}} ca m’imprime bien le nom de la variable, mais pas son contenu.
si j’imprime {{dico_context .Checked_sel.{{forloop.counter}}}} ca plante.
si j’imprime {{dico_context .Checked_sel.forloop.counter}} ca ne plante pas mais la variable est vide

Help
Pierre

Salut Pierre,

Pourrais-tu préciser le format de template que tu utilises pour générer ton html ? Jinja2 ?

Je suis surpris par le formalisme dans ton html. Si j’ai bien compris dico_context est de type dict. Du coup le {{dico_context.Checked_sel.forloop.counter}} je l’aurai vu {{dico_context["Checked_sel"][forloop.counter]}} car dico_context["Checked_sel"] est une list d’après ta définition des données.

Une autre question tu itères sur dico_context.liste, je n’ai pas trouvé la définition de cet objet ?

Si le code n’est pas confidentiel :stuck_out_tongue_winking_eye: , pourrais-tu le partager en totalité ?

Merci thomas, pas de probleme pour partager le debut de code. En fait, interdit que je suis d’acolab car à plus de 10km, je me suis dit que l’occasion etait venue de migrer mes volets sur un Pi pour 2 raisons:
- je ne peux plus faire de modif etant arrivé au bout de la memoire de l’ESP.
- Ce serait une occasion en or pour voir un peu comment marche python html et django car je n’y connais pas grand chose dans aucun de ces domaines. J’ai donc suivi le MOOC python , j’ai transpiré un peu sur Django, et me voila à pied d’oeuvre et je merde sur une double resolution. En fait dans dico_context.Checked_sel.forloop.counter, il faut d’abord faire une premiere resolution du compteur de boucle (forloop.counter) puis une 2eme resolution de la variable dico_context.Checked_sel.forloop.counter. Et c’est cela que je n’arrive pas à faire. J’ai essayé la syntaxe que tu proposes mais elle plante.

le code est le suivant mais il ne tourne que dans l’environnement Django.

cordeliers.zip (45,8 Ko)

L’erreur se trouve dans le fichier :
E:\Donnees\python\django\cordeliers\volets\templates\volets\volets.html ligne 41 a 44
qui est appelé par
E:\Donnees\python\django\cordeliers\volets\views.py

tu peux voir les lignes 34 et 35 du html ou on a la meme chose mais sans la double resolution ca fonctionne parfaitement.

avec l’affichage de la ligne 42 du html ca donne cela : on voit que le nom de la variable est bon, mais je suis pas foutu de voir ce qu’il y a dans la variable.

en ce qui concerne l’iteration sur dico_context.liste, j’avais simplifié le code pour focaliser sur l’endroit ou ca merde. Mais le dictionnaire contient bien la liste sur laquelle j’itere.

Si j’ai bien compris la doc Django et ce que tu veux faire, ce n’est pas possible

Notez que bar dans une expression de gabarit comme {{ foo.bar }} est interprété comme une chaîne littérale et même si une variable « bar » existe dans le contexte du gabarit, elle ne sera pas appelée.

Faut passer au plan B :wink:

Toujours avec ma compréhension de ton code, est ce que tu ne pourrais pas remplacer {{dico_context .Checked_sel.forloop.counter}} par {{dico_context .Checked_sel.pop(0)}}. Methode pop.
A chaque itération de ta boucle for tu retournes et retires le premier élément de la liste.

N’ayant pas Django, je n’ai pas essayé :wink:

Une autre solution serait de modifier ton modèle de donnée en définissant un objet volet de type dict de la forme

volet = {"name": "mon volet", "status": "checked" }
liste_volets = {"liste":[volet1, volet2],  "heures": intro, "version": Version, "Checked_descente":coche}

Et donc ton template deviendrait

{% for volet  in liste_volets.liste  %}
	<input type="radio" name="liste_volet" id="liste_volet{{ forloop.counter }}" value="{{ forloop.counter }}  {{volet.status}} >
	<label for="liste_volet{{ forloop.counter }}">{{ volet.name }}  </label><br>
{% endfor %}

Le coup du pop, ça me paraît génial et simple. J’essaierai asap.
merci. je te tiens au courant.

Ca marche !!! Merci Thomas, encore une fois tu es mon heros . Je ne savais pas qu’on pouvait utiliser certaines fonctions simplifiees de python dans hmtl. J’ai l’impression que le chemin de la decouverte sera long :slight_smile:
Merci en tout cas pour ton aide.

Ce n’est pas vraiement une fonctionnalité de Python mais plutôt de Django

Techniquement, lorsque le système de gabarits rencontre un point, il essaie les méthodes d’accès suivantes, dans l’ordre :

  • Consultation de dictionnaire
  • Consultation d’attribut ou de méthode
  • Consultation d’indice numérique

Si la valeur résultante est exécutable, elle est appelée sans paramètre. Le résultat de l’appel devient la valeur de gabarit.