Voila je voudrais que lorsque mon programme arrive à une certaine ligne X, que mon programme revienne en arrière à la ligne Y. Je ne sais pas si cela est possible. Merci d'avance de votre aide.
Car de base j'ai utilisé une boucle while mais le problème cest que j'utilise tkinter et lorsque je mets mon code tkinter a l'intérieur de la boucle tous bug
Si la boucle while doit être une boucle infinie, alors effectivement tu ne peux pas l'utiliser avec tkinter. Il faut que tu définisse un callback.
En gros tu encapsule tout le code qui doit boucler dans une fonction (/méthode d'instance si POO) et tu rappelles cette fonction toutes les X millisecondes en plaçant cette ligne à la fin de la fonction en question:
root.after(ta_fonction, tps) # root est une instance de Tk
la méthode after définie un callback : c'est à dire que "ta_fonction" est appelée après "tps" ms.
Tkinter induisant une programmation évènementielle et non juste linéaire, tu est obligé de rendre la main à la mainloop à un moment ou un autre : d’où l'impossibilité d'utiliser une boucle infinie.
Traceback (most recent call last):
File "C:\Users\nicol\Desktop\Meteo2.py", line 205, in <module>
app.after(fonction, 2000)
File "A:\Python2.7\lib\lib-tk\Tkinter.py", line 598, in after
callit.__name__ = func.__name__
AttributeError: 'int' object has no attribute '__name__'
Je suis dans l'obligation d'utiliser Python 2.7 pour rappel. Merci de votre aide.
Il ne me semble pas si tu veux je peux t'envoyer le code mais ca risque de te piqué les yeux ( je suis débutant et je ne sais pas faire énormément de chose propre)
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from BeautifulSoup import *
import requests
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import time
def fonction():
global app
try:
ville = EntryVille.get()
destinataire = EntryDestinataire.get()
password = EntryPassword.get()
#ville = raw_input("Saisir votre ville (Francaise uniquement): ") #Selection de la ville
#Recuperation de la page (tableau) en fonction de la ville choisi
Info = requests.get("http://api.openweathermap.org/data/2.5/weather?q="+ville+",fr&appid=41e0ba6f6d2d3f7db3f16960cd553e73").json()
temp = Info['main']['temp'] #Recuperation de la donnee temperature actuelle
tempMax = Info['main']['temp_max'] #Recuperation de la donnee temperature maximale
tempMin = Info['main']['temp_min'] #Recuperation de la donnee temperature minimale
humide = Info['main']['humidity'] #Recuperation de la donnee humidite
pression = Info['main']['pressure'] #Recuperation de la donnee pression
visibilite = Info['visibility'] #Recuperation de la donnee sur la distance de visibilite
#Convertion (Fahrenheit en Celsius) et arrondie a la deuxieme decimale
degres = temp-273
degresMax = tempMax-273
degresMin = tempMin-273
degres = round(degres,2)
degresMin = round(degresMin,2)
degresMax = round(degresMax,2)
affichage = Label(app, text=(" ")).place(x=110,y=140)
EtatSysteme = Label(app, text="Etat :", font=("Helvetica", 9)).place(x=240 ,y=140)
Erreur = Label(app, text="Fonctionnel", fg="darkgreen", font=("Helvetica", 9)).place(x=270 ,y=140)
affichage = Label(app, text=(" ")).place(x=110,y=170)
#Dictionnaire pour traduire le temps prévu (Anglais en Francais)
TempsEN = Info['weather'][0]['main']
Temps = {}
Temps['Rain']='pluvieux'
Temps['Clear']='degage'
Temps['Snow']='enneige'
Temps['Storm']='orageux'
Temps['Clouds']='nuageux'
Temps['Mist']='brouillard'
Temps['Thunderstorm']='tres orageux'
print("La temperature a "+ville+" est de: "+str(degres)+" degres .")
Efface = Label(app, text=(" ")).place(x=110,y=170)
affichage1 = Label(app, text=("La temperature a "+ville+" est de: "+str(degres)+" degres .")).place(x=168,y=170)
print("Le temps est "+Temps[TempsEN]+".")
Efface = Label(app, text=(" ")).place(x=110,y=190)
affichage2 = Label(app, text=("Le temps est "+Temps[TempsEN]+". ")).place(x=221,y=190)
print("La temperature maximal du jour de "+str(degresMax)+" degres et descendra jusqu'a "+str(degresMin)+" degres .")
Efface = Label(app, text=(" ")).place(x=110,y=210)
affichage3 = Label(app, text=("La temperature maximal du jour de "+str(degresMax)+" degres et descendra jusqu'a "+str(degresMin)+" degres .")).place(x=70,y=210)
print("L'humidite a "+ville+" est de: "+str(humide)+"% et la pression est de "+str(pression)+" PA .")
Efface = Label(app, text=(" ")).place(x=110,y=230)
affichage4 = Label(app, text=("L'humidite a "+ville+" est de: "+str(humide)+"% et la pression est de "+str(pression)+" PA . ")).place(x=130,y=230)
#Determination de la direction du vent
try:
direcVent = Info['wind']['deg'] #Recuperation de la donnee direction du vent
if 0<= direcVent <=(90/4):
direcVent = "Nord"
if (360-(90/4))< direcVent <=360:
direcVent = "Nord"
if (90-(90/4))< direcVent <= (90+(90/4)):
direcVent = "Est"
if (180-(90/4))< direcVent <= (180+(90/4)):
direcVent = "Sud"
if (270-(90/4))< direcVent <= (270+(90/4)):
direcVent = "Ouest"
if (90/4)< direcVent <= (90-(90/4)):
direcVent = "Nord-Est"
if (90+(90/4))< direcVent <= (180-(90/4)):
direcVent = "Sud-Est"
if (180+(90/4))< direcVent <= (270-(90/4)):
direcVent = "Sud-Ouest"
if (270+(90/4))< direcVent <= (360-(90/4)):
direcVent = "Nord-Ouest"
Vvent = Info['wind']['speed'] #Recuperation de la donnee vitesse du vent
Vvent = Vvent*1.852 #Convertion noeuds -> Km/h
Vvent = round(Vvent,2) #Arrondie a 2 decimales
print("Le vent souffle a "+str(Vvent)+"km/h et de la direction "+str(direcVent)+" .") #Affichage
Efface = Label(app, text=(" ")).place(x=110,y=250)
affichage5 = Label(app, text=("Le vent souffle a "+str(Vvent)+"km/h et de la direction "+str(direcVent)+". ")).place(x=132,y=250)
except:
print(Vvent+directVent)
direcVent = 0
Vvent = 0
Efface = Label(app, text=" ").place(x=132 ,y=250)
affichage5 = Label(app, text=("Le vent est pas la quasiment inexistant ")).place(x=195,y=250)
#Simplification d'affichage
if visibilite==10000:
DistVisibilite=">10 000 m"
else:
DistVisibilite=("de "+str(visibilite)+"m")
print("La visibilite actuelle est "+str(DistVisibilite)+".")
Efface = Label(app, text=" ").place(x=132 ,y=270)
affichage6 = Label(app, text=("La visibilite actuelle est "+str(DistVisibilite)+".")).place(x=195,y=270)
#Envois du mail
#Systeme d'alerte
if visibilite<200 or tempMin<10 or TempsEN=='Storm' or TempsEN=='Snow' or Vvent>50:
#Déclaration des risques
if visibilite<200:
Alerte1='- Brouillard intense\n'
else: Alerte1=''
if 0<tempMin<10:
Alerte2='- Température froide (comprise entre 0 et 10 °C)\n'
else: Alerte2=''
if tempMin<1:
Alerte3='- Verglas\n'
else: Alerte3=''
if TempsEN=='Storm':
Alerte4='- Orage\n'
else: Alerte4=''
if TempsEN=='Snow':
Alerte5='- Tombée de neige \n'
else: Alerte5=''
if Vvent>50:
Alerte6='- Vents violents\n'
else: Alerte6=''
#Information du mail
msg = MIMEMultipart()
msg['From'] = 'TRUC@gmail.com'
msg['To'] = destinataire
msg['Subject'] = '[ALERTE] STATION METEO'
message = ("[ALERTE METEO] Un risque est présent à "+ville+", d'après l'analyse qu'a réalisé votre station météo, il semble qu'il y est des risques de : \n")
msg.attach(MIMEText(message+Alerte1+Alerte2+Alerte3+Alerte4+Alerte5+Alerte6))
#Element de connection a l'adresse mail de l'expediteur
mailserver = smtplib.SMTP('smtp.gmail.com', 587) #Reference sur le web de l'adresse mail
mailserver.starttls()
mailserver.login(destinataire,password) #Commande pour se connecter
mailserver.sendmail(destinataire,destinataire, msg.as_string()) #Formulation de l'envoyer le mail
mailserver.quit()
print("Une/Des alerte(s) est/sont envoyee(s)") #Confirmation de l'envois du mail
ConfirmMail = Label(app, text="Une/Des alerte(s) est/sont envoyée(s) par mail !", fg="red", font=("Helvetica", 9)).place(x=154, y= 290)
else:
ConfirmMail = Label(app, text=" ").place(x=154, y= 290)
except:
EtatSysteme = Label(app, text="Etat :", font=("Helvetica", 9)).place(x=164 ,y=140)
Erreur = Label(app, text="Une erreur de connexion s'est réalisé !", fg="red", font=("Helvetica", 9)).place(x=200 ,y=140)
affichage1 = Label(app, text=("-----------------------------------------------------------------------")).place(x=110,y=170)
Efface = Label(app, text=(" ")).place(x=110,y=190)
Efface = Label(app, text=(" ")).place(x=70,y=210)
Efface = Label(app, text=(" ")).place(x=110,y=230)
Efface = Label(app, text=(" ")).place(x=110,y=250)
Efface = Label(app, text=(" ")).place(x=110,y=270)
Efface = Label(app, text=(" ")).place(x=110,y=290)
print("Une erreur de connexion s'est realise")
app.after(fonction, 2000)
def Quitapp():
app.quit()
#Affichage application
from Tkinter import *
app = Tk()
app.title("Station Météo")
app.resizable(width=False, height=False)
app.geometry("600x450+500+250")
PhraseIntroVille = Label(app, text="Entrer le nom de la ville:").place(x=78 ,y=10)
EntryVille=StringVar()
Ville = Entry(app, width=40, textvariable=EntryVille,justify=CENTER).place(x=210, y=10)
PhraseIntroMail = Label(app, text="Entrer votre e-mail:").place(x=84 ,y=30)
EntryDestinataire=StringVar()
Destinataire = Entry(app, width=40, textvariable=EntryDestinataire,justify=CENTER).place(x=210, y=30)
PhraseIntroPassword = Label(app, text="Entrer votre mot de passe:").place(x=65 ,y=50)
EntryPassword=StringVar()
Password = Entry(app, width=40, textvariable=EntryPassword,justify=CENTER, show='*').place(x=210, y=50)
Valide = Button(app, text="Enregistrer", width=20, height=2, command=fonction).place(x=215, y=80)
Quit = Button(app, text="Quitter", width=25, height=2, command=Quitapp).place(x=195, y=320)
app.mainloop()
C'est effectivement affreux comme code ! Il faudrait au moins découper en plusieurs fonctions la fonction fonction (qui est très mal nommée d'ailleurs).
Ton problème est de découper en plusieurs actions le callback fonction. Après il y a trop d'erreurs, des écrasements de la variable Label, Efface, ... que je ne comprend absolument pas !
Traceback (most recent call last):
File "C:\Users\nicol\Desktop\Meteo2.py", line 205, in <module>
app.after(fonction, 2000)
File "A:\Python2.7\lib\lib-tk\Tkinter.py", line 598, in after
callit.__name__ = func.__name__
AttributeError: 'int' object has no attribute '__name__'
Je suis dans l'obligation d'utiliser Python 2.7 pour rappel. Merci de votre aide.
Au passage, j'ai dis une bêtise. Pour after, il faut passer d'abord le temps et ensuite la fonction. C'est de là que viens cette erreur.
Bon génial j'ai réussi au bout de plusieurs heures. Merci mais maintenant mais différentes fonctions se réalisent mais elles n'arrivent pas à lire des variables qui ont était traité dans d'autre fonction. Comment faire pour qu'elles puissent lire ces variables ?
Exception in Tkinter callback
Traceback (most recent call last):
File "A:\Python2.7\lib\lib-tk\Tkinter.py", line 1541, in __call__
return self.func(*args)
File "A:\Python2.7\lib\lib-tk\Tkinter.py", line 592, in callit
func(*args)
File "C:\Users\nicol\Desktop\Meteo2.py", line 11, in AffichageTkinter
if ConnectNetwork==1:
NameError: global name 'ConnectNetwork' is not defined
Non s'il vous plait j'aurais besoin que vous me donniez la réponse très rapidement c'est pour un projet dont je passe à l'oral demain. Merci de votre compréhension.
Non ça ne fonctionne pas comme ça, cette variable se trouvent dans des fonctions, seulement lorsqu'une fonction termine son exécution, elle supprime de son environnement toutes variables créées. Il faut trouver un moyen de garder globalement cette variable en mémoire.
Ah c'est bon super j'ai réussi il fallait que je passes les variables en paramètre de la fonction
Comment retourner à une ligne précise du code [PY]
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Blond, bouclé, toujours le sourire aux lèvres...