# -*- coding: utf-8 -*- """ Éditeur de Spyder Ceci est un script temporaire. """ from tkinter import* from math import* from tkinter.messagebox import * from tkinter import filedialog ## on rentre donc ici dans une nouvelle fenêtre qui va nous permettre de choisir soit le programme "Transformation de coordonnées à 7 paramètres entre 2 systèmes" ou soit "Transformation de coordonnées à 7 paramètres entre 2 systèmes (Passage inverse)" en choisissant soit le bouton de droite ou celui de gauche## def ouvrir1(): if askokcancel("Message d'information à l'utilisateur","Vous avez décidez d'utiliser le programme transformation de coordonnée. \nEtes-vous sur de vouloir faire ça?" ): showinfo("Information","allons-y") else: showinfo("Information","retour à l'accueil") transformation.destroy() ###ceci permet de prevenir l'utilisateur de son choix, il peut soir confirmer et donc aura une information de confirmation ou il peut aussi invalider et dans ce cas il aura pour information qu'il retournera à l'accueil et la fenetre se "détruira" comme il s'agissait d'une mauvaise manipulation### transformation=Toplevel(Mafenetre) lab=Label(transformation) lab.pack() #ici on utilise la fonction .pack car il n'y avait que 2 boutons a placer dans cette fenêtre et comme nous avons commencé avec cette méthode issu du lien internet que vous nous avez transmis, nous avons décidé de garder cette fonction qui permet donc de placer nos boutons selon une direction et un jeu de coordonnées selon x et y # Bouton1=Button(transformation,text='Transformation de coordonnées à 7 paramètres entre 2 systèmes',command=ouvrir5) Bouton1.pack(side=LEFT,padx=5,pady=5) Bouton3=Button(transformation,text='Transformation de coordonnées AUTO',command=ouvrir5AUTO) Bouton3.pack(side=LEFT,padx=5,pady=5) Bouton2=Button(transformation,text='Transformation de coordonnées à 7 paramètres entre 2 systèmes (Passage inverse)',command=ouvrir6) Bouton2.pack(side=LEFT,padx=5,pady=5) #Il s'agit du 1er programme qui découle ici du bouton "Transformation de coordonnées" puis du bouton "Transformation de coordonnées à 7 paramètres entre 2 systèmes" # # nous allons essayer de détailler au maximum une fonction et ensuite nous détaillerons juste certains changements car il s'agit en partie de la répétition de mêmes echaninements # def ouvrir5(): transformation1=Toplevel(Mafenetre) # lab=Label(transformation1) # lab.grid() # Ici, on initialise en demandant au programme de placer les cases de selection des entrées et le bouton calculer sous forme de grille par ligne (row) et colonne (column). Je précise qu'initialement nous utilisions la formule .pack mais cette dernière s'est avérée trop compliqué a utiliser pour donner un beau rendu ### transformation1.geometry('3000x1000+1+1') #cette ligne permet d'ouvrir une fenêtre pratiquement entière pour que l'utilisateur ne passe pas à coté de certaines infos du programme et aussi pour lui éviter à chaque fois d'ouvrir en grand la fenêtre# def calcul1(): Resultat1.set("Vx (m)="+str(Tx.get()+Ux.get()*(1+D.get())+Uz.get()*Ry.get()-Uy.get()*Rz.get())) Resultat2.set("Vy (m)="+str(Ty.get()+Uy.get()*(1+D.get())+Ux.get()*Rz.get()-Uz.get()*Rx.get())) Resultat3.set("Vz (m)="+str(Tz.get()+Uz.get()*(1+D.get())+Uy.get()*Rx.get()-Ux.get()*Ry.get())) # ici basiquement on écrit notre programme pour les calculs en adaptant à la version Tkinter en ajoutant .get(), .set() sans lesquels il serait impossible de lire les résultats # Bouton=Button(transformation1,text='Calculer',command=calcul1) # ici on demande donc de mettre un bouton sur lequel on appuiera pour réaliser le calcul du programme placé juste au dessus, d'ou le nom "command=calcul1" car il execute le calcul de la fonction "calcul1" # Bouton.grid(row=11,column=1) # on positionne donc le bouton à la 11e ligne initialiser par lab.grid du debut du programme et on le place a la 11e ligne car il y aura 10 caracteres à rentrer avant pour les calculs# Ux=DoubleVar() #on nomme la variable comme pouvant être entiere ou décimale grace au doubleVar# champ1=Entry(transformation1,textvariable=Ux) #avec Entry on fait une zone de saisi de texte dans laquelle on pourra saisir les données (nombres) à remplir pour exécuter le calcul. On répète donc ceci le nombre de fois ou l'on doit saisir les paramètres pour réaliser le calcul# champ1.focus_set() champ1.grid(row=1,column=2) #on positionne ici la première case pour saisir la variable d'entrée# Label1 = Label(transformation1, text = 'Ux (m)=',fg="navy") #on ecrit ici que l'on souhaite rendre visible le nom de la première variable d'entrée, on la nomme et on choisit aussi une couleur plus remarquante# Label1.place(x = 7, y = 20) #ici on place la variable d'entrée, pour déterminer cette position x,y on procède avant au taton, si je puis dire et on corrige si nécéssaire# Uy=DoubleVar() champ2=Entry(transformation1,textvariable=Uy) champ2.focus_set() champ2.grid(row=2,column=2) Label2 = Label(transformation1, text = 'Uy (m)=',fg="navy") Label2.place(x = 7, y = 38) Uz=DoubleVar() champ3=Entry(transformation1,textvariable=Uz) champ3.focus_set() champ3.grid(row=3,column=2) Label3 = Label(transformation1, text = 'Uz (m)=',fg="navy") Label3.place(x = 7, y = 58) Tx=DoubleVar() champ4=Entry(transformation1,textvariable=Tx) champ4.focus_set() champ4.grid(row=4,column=2) Label4 = Label(transformation1, text = 'Tx (m)=',fg="navy") Label4.place(x = 7, y = 78) Ty=DoubleVar() champ5=Entry(transformation1,textvariable=Ty) champ5.focus_set() champ5.grid(row=5,column=2) Label5 = Label(transformation1, text = 'Ty (m)=',fg="navy") Label5.place(x = 7, y = 95) Tz=DoubleVar() champ6=Entry(transformation1,textvariable=Tz) champ6.focus_set() champ6.grid(row=6,column=2) Label6 = Label(transformation1, text = 'Tz (m)=',fg="navy") Label6.place(x = 7, y = 115) D=DoubleVar() champ7=Entry(transformation1,textvariable=D) champ7.focus_set() champ7.grid(row=7,column=2) Label7 = Label(transformation1, text = 'D =',fg="navy") Label7.place(x = 17, y = 133) Rx=DoubleVar() champ8=Entry(transformation1,textvariable=Rx) champ8.focus_set() champ8.grid(row=8,column=2) Label8 = Label(transformation1, text = 'Rx (rad)=',fg="navy") Label8.place(x = 4, y = 150) Ry=DoubleVar() champ9=Entry(transformation1,textvariable=Ry) champ9.focus_set() champ9.grid(row=9,column=2) Label9 = Label(transformation1, text = 'Ry (rad)=',fg="navy") Label9.place(x = 4, y = 170) Rz=DoubleVar() champ10=Entry(transformation1,textvariable=Rz) champ10.focus_set() champ10.grid(row=10,column=2) Label10 = Label(transformation1, text = 'Rz (rad)=',fg="navy") Label10.place(x = 4, y = 190) Resultat1=DoubleVar() Resultat2=DoubleVar() #Ici,même demande: on fait aussi en sorte que le résultat affiché soit un nombre entier ou un nombre décimal# Resultat3=DoubleVar() calcul1() Label(transformation1,text="Ce programme permet à partir d'un jeu de 7 paramètres (3 translations, 1 facteur d'échelle et 3 rotations) de passage du système(1) vers le système (2), et des coordonnées cartésiennes tridimentsionnelles dans le système (1), calcul des ",fg="red").place(x=1, y=250) #ici on souhaite positionner une explication de programme, ce qu'il fait, les données d'entrée et de sortie# Label(transformation1,text=" coordonnées cartésiennes tridimensionnelles dans le système (2).",fg="red").place(x=1, y=270) Label(transformation1,text='Transformation de coordonnées à 7 paramètres entre 2 systèmes :',fg="green").place(x=1, y=1) #ici on place un sous-titre pour indiquer à l'utilisateur qu'il ne s'est pas trompé de programme# Label(transformation1,text='Résultat du programme ---> ').place(x=210, y=120) Label(transformation1,text='I ').place(x=210, y=135) Label(transformation1,text='I ').place(x=210, y=140) Label(transformation1,text='I ').place(x=210, y=150) Label(transformation1,text='I ').place(x=210, y=160) Label(transformation1,text='^ ').place(x=207, y=170) #sur ces lignes de 88 à 97 nous avons essayé de rendre plus agréable et intéractive la fenêtre du programme, il s'agit en effet de fait maison mais l'utilisation de la version Tkinter n'est pas facile, il y a beaucoup de choses pas entièrement comprises mais nous avons essayer de nous débrouiller comme nous avons pu# Label(transformation1,text='I ').place(x=210, y=180) Label(transformation1,text='I ').place(x=210, y=190) Label(transformation1,text='I ').place(x=210, y=200) Label(transformation1,text='I ').place(x=210, y=210) Label(transformation1,text='- - - ->- - - - - - ->- - - - - ').place(x=70, y=215) Frame1 = Frame(transformation1,bg="blue", borderwidth=8, relief=GROOVE) #ici on fait une nouvelle fenêtre dans la fenêtre principale pour mettre plus en evidence les résultats du programme, niveau explication, on met en bleu les contours et le reste est récupéré du forum que vous nous avez donné et nous n'avons pas réellement trouvé de moyen de changer le "GROOVE" par exemple...# Frame1.place(x = 370, y = 100) #ici on positionne donc la nouvelle fenetre comme on le desire# Label(Frame1,textvariable=Resultat1,fg="green",bg="cyan").grid(row=1,column=1) #ici on place dans notre nouvelle petite fenetre les 3 résusltats issu du calcul# Label(Frame1,textvariable=Resultat2,fg="green",bg="cyan").grid(row=2,column=1) Label(Frame1,textvariable=Resultat3,fg="green",bg="cyan").grid(row=3,column=1) Frame2 = Frame(transformation1 ,bg="red",borderwidth=6, relief=GROOVE) Frame2.place(x=3,y=300) Label(Frame2,text="Paramètres à saisir en entrée :",fg="red",bg="white").grid(row=1,column=1) Label(Frame2,text="Ux : vecteur de coordonnée cartésienne suivant x dans le système (1)",fg="navy",bg="white").grid(row=2,column=2) Label(Frame2,text="Uy : vecteur de coordonnée cartésienne suivant y dans le système (1)",fg="navy",bg="white").grid(row=3,column=2) Label(Frame2,text="Uz : vecteur de coordonnée cartésienne suivant z dans le système (1)",fg="navy",bg="white").grid(row=4,column=2) Label(Frame2,text="Tx : translation suivant l'axe x ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=5,column=2) Label(Frame2,text="Ty : translation suivant l'axe y ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=6,column=2) Label(Frame2,text="Tz : translation suivant l'axe z ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=7,column=2) Label(Frame2,text="D : facteur d'échelle ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=8,column=2) Label(Frame2,text="Rx : angle de rotation de l'axe des x ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=9,column=2) Label(Frame2,text="Ry : angle de rotation de l'axe des y ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=10,column=2) Label(Frame2,text="Rz : angle de rotation de l'axe des z ( de (1) vers (2)) ",fg="navy",bg="white").grid(row=11,column=2) ## à détailler### Frame3 = Frame(transformation1,bg="red",borderwidth=6, relief=GROOVE) Frame3.place(x=600,y=300) Label(Frame3,text="Paramètres affichés en sortie :",fg="red",bg="white").grid(row=1,column=1) Label(Frame3,text="Vx : vecteur de coordonnée cartésienne suivant x dans le système (2)",fg="green",bg="white").grid(row=2,column=2) Label(Frame3,text="Vy : vecteur de coordonnée cartésienne suivant x dans le système (2)",fg="green",bg="white").grid(row=3,column=2) Label(Frame3,text="Vz : vecteur de coordonnée cartésienne suivant x dans le système (2)",fg="green",bg="white").grid(row=4,column=2) showwarning("Message à l'utilisateur",'Pour que le programme fonctionne correctement veuillez bien remplir les cases pour le calcul. \nVeuillez remplir de cette manière; \nEx: 33.89 (et non 33,89) \nEnfin veuillez à bien respecter les unités de chacune des valeurs que vous rentrez (elles sont affichées à coté des champs de saisie).') ## on propose de laisser un message "d'alerte" à l'utilisateur, il doit bien remplir les cases nécessaires au calcul pour obtenir un résultat possible et également bien respecter les unités des valeurs qu'il va saisir## def ouvrir5AUTO(): transformation1=Toplevel(Mafenetre) # lab=Label(transformation1) # lab.grid() # Ici, on initialise en demandant au programme de placer les cases de selection des entrées et le bouton calculer sous forme de grille par ligne (row) et colonne (column). Je précise qu'initialement nous utilisions la formule .pack mais cette dernière s'est avérée trop compliqué a utiliser pour donner un beau rendu ### import tkinter.tix as tix root = tix.Tk () o = tix.FileSelectBox (root) o.pack () def print_file () : print(o.cget ("value")) b = tix.Button (root, text = "print") b.config (command = print_file) b.pack () root.mainloop () Mafenetre=Tk() Mafenetre.title('CALCULS GEODESIQUES') ## ici comme le nom l'indique on donne un titre a nos fenetres qui seront toutes ouvertes au fur et à mesures des beoins de l'utilisateur# Mafenetre.geometry('1000x500+1+1') Frame1 = LabelFrame(Mafenetre ,text="BIENVENUE") Frame1.place(x = 10, y = 10) Label(Frame1,text="Nous vous proposons ici 4 choix possibles pour réaliser vos calculs géodésiques selon vos souhaits. \nTransformation de coordonnées va vous permettre de ",fg="green",bg="cyan").grid(row=1,column=1) ### Ici on rentre 4 boutons dans le premier menu nous permettant de choisir chacune des opérations de calculs à mener ### ### nous avons décider d'en faire seulement 4 différents car les autres menus possédant les mêmes début de noms sont quand à eux à choisir aux barres de menu suivantes ### ### il s'agit donc d'une sorte d'initialisation de notre programme ### Frame2 = Frame(Mafenetre ,bg="blue", borderwidth=8, relief=GROOVE) Frame2.place(x = 50, y = 50) Bouton1=Button(Frame2,text='Transformation de coordonnées',command= ouvrir1 ,cursor="target") Bouton1.grid(row=1, column=1) Bouton2=Button(Frame2,text='Module linéaire',command=ouvrir2,cursor="target") Bouton2.grid(row=1, column=2) Bouton3=Button(Frame2,text='Détection de fuseau UTM et de calcul des paramètres standards',command=ouvrir3,cursor="target") Bouton3.grid(row=1, column=3) Bouton4=Button(Frame2,text='Conversion',command=ouvrir4,cursor="target") Bouton4.grid(row=1, column=4) Mafenetre.mainloop()