IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Actualiser fonction durant l'utilisation du programme


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Actualiser fonction durant l'utilisation du programme
    Bonsoir,

    J'ai crée un petit programme.
    Au lancement du programme celui-ci va vérifier si il est connecté à internet ou pas.
    Voila la partie du code qui traite ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import socket
     
     
    def connexion():
        # test connexion internet
        try:
            # connect to the host -- tells us if the host is actually
            # reachable
            socket.create_connection(("www.google.com", 80))
            return True
        except OSError:
            pass
        return False
    en fonction du résultat TRUE/FALSE j'affiche un icone vert ou rouge dans une fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #-------- Affichage connexion internet dans Frame1
     
    if connexion() == True :
        img1 = ImageTk.PhotoImage(file="connexion_ok.ico") #logo vert
        logo_reseau = tk.Label(Frame01, image=img1)
     
    else :
        img1 = ImageTk.PhotoImage(file="connexion_ko.ico") # logo rouge
        logo_reseau = tk.Label(Frame01, image=img1)
    Cependant je voudrais qu'en cas de perte de connexion internet durant l'utilisation du programme celui-ci affiche le logo rouge.
    je pense qu'il faut actualiser la fonction connexion()

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    bonjour,

    bon actualiser ne veux pas vraiment dire grand chose dans votre cas mais on peut comprendre quand même
    vous avez plus ou moins 2 moyens (et quelques variantes,j'en oublie surement d'autres) :
    • vérifier tous les X durées l'état de votre connexion
    • réagir à un événement qui vous dit quand il y a un changement d'état


    une connexion n'est en rien absolue, en effet ce n'est qu'une connexion entre deux tiers de même qu'il n'existe pas de débit absolu ou de latence absolue. Bon en pratique il y a plus de chance que se soit un problème venant de chez vous que de Google, cependant en utilisant un nom de domaine vous ajouter un risque supplémentaire et il sera préférable d'utiliser une ip comme le serveur dns de votre FAI, celui de Google (8.8.8.8) ou 1.1.1.1 (Cloudflare).


    bon la 2ème solution est déjà plus hardcore et si quelqu'un à quelques pistes je suis preneur par curiosité

    bon sinon j'aurais pas écrit le code exactement pareil, en nom de fonction quelque chose comme is_connected montrant bien un état ou has_connection, mais connexion pour moi ça représente soit une action de se connecter soit l’objet représentant la connexion.

    Aussi True/False/None sont des singletons, c'est à dire qu''une seule instance ne peux être en mémoire dans un programme Python, il est donc préférable d'utiliser le mot clef is donc if connexion() == True : -> if is_connected() is True:également la seule chose qui change de votre programme c'est le nom du fichier, on pourrait donc écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if is_connected() is True:
        filename = "connexion_ok.ico"
     
    else:
       filename = "connexion_ko.ico"
     
    img1 = ImageTk.PhotoImage(file=filename)
    logo_reseau = tk.Label(Frame01, image=img1)

    on peux allez bien sur plus loin avec seulement une lignelogo_reseau = tk.Label(Frame01, image=ImageTk.PhotoImage(file="connexion_ok.ico" if is_Connected() else "connexion_ko.ico")) mais là c'est un peu trop exagéré selon moi

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci d'avoir pris le temps de me lire

    Dsl si mon code comporte des erreurs je suis un débutant ^^

    Aurais tu un bout de code pour la solution de vérifier tous les X durées l'état de votre connexion ?

    j'ai essayé avec .after() mais je bloque totalement...

  4. #4
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    voici un exemple basique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import tkinter
     
     
    root = tkinter.Tk()
     
    def task():
        print("hello")
        root.after(2000, task)
     
    task()
    root.mainloop()
    cependant pour une opération réseau ce n'est pas la solution à privilégier puisque l'opération socket.create_connection est bloquant, c'est à dire que le programme ne peux rien faire d'autre, si y'a internet on reprend la main au bout de quelques dizaines à centaines de ms suivant l'état de la connexion mais si on pas internet et bien ça va timeout, et comme le nom l'indique c'est si l'on a eu aucune réponse au bout d'un certain temps, mais pendant ce temps l'interface ne s'actualise plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import tkinter
    import time
     
     
    root = tkinter.Tk()
     
    def task():
        print("hello")
        time.sleep(1)
        root.after(2000, task)
     
    task()
    root.mainloop()
    si vous testez cet exemple et que vous agrandissez la taille de la fenêtre vous allez voir une saccade (en tout cas c'est le comportement que je remarque avec windows 10), peut être que l'implémentation de la gestion des fenêtres est faite d'une façon où dans tel ou tel OS il est possible de redimensionner la fenêtre de ce cas, mais cet effet de blocage s'il ne se manifeste pas par le redimensionnement se manifestera autrement.

    et là ça commence à être assez vite compliqué puisqu'il faut soit jouer avec du multithreading or tkinter n'est pas "thread-safe" c'est à dire que dans un autre autre thread vous ne pouvez pas toucher à l'interface et donc il faut jouer avec des "callbacks" qui pourrait se traduire par appelle plus tard, c'est ce que l'on faut avec root.after(2000, task), task est un callback. Il faut donc que dans votre thread vous appeliez un callback qui sera exécuté dans le thread principal, c'est à dire celui de tkinter qui se chargera de mettre à jour votre interface (changer l'icone)

    Une solution que je trouve plus simple à mettre en place mais qui ne nécessite pas moins de connaissance malheureusement est d'utiliser une implémentation de l'api de tkinter de manière asynchrone et d'utiliser à coté d'autres bibliothèques permettant de faire des tests de connexions de façon asynchrone, ce qui veux dire boucle d’événement, ect ... mais faut un peu de baguage.


    bien-sur en réalité ses deux notions ne sont pas contraires mais complémentaires, il existe des "ponts" entre ces deux mondes et celui de référence dans le stdlib est Asyncio.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2020
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse je vais regarder ça

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par flapili Voir le message
    bon la 2ème solution est déjà plus hardcore et si quelqu'un à quelques pistes je suis preneur par curiosité
    Microsoft a mis en place tout une infrastructure juste pour avoir le Network Status Connectivity Indicator (NCSI) qu'on a sur tout les PC.
    Peut être pas utilisable de façon industrielle sans regarder le côté légal, mais intéressante à regarder.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    De mon coté j'ai cherché un peu coté win32 et je suis tombé sur ça isnetworkalive et InternetCheckConnection, par contre je ne trouve pas grand chose sur NCSI.

    Sur linux à priori ce serait plus simple avec des sockets netlink mais dans tous les cas il n'existe aucune méthode de haut niveau et cross plateforme.

Discussions similaires

  1. [Débutant] Utilisation de la fonction Matlab "imcrop" dans un programme Java
    Par ingeta dans le forum MATLAB
    Réponses: 0
    Dernier message: 08/04/2014, 18h46
  2. Réponses: 4
    Dernier message: 26/09/2011, 16h12
  3. comment utiliser un programme comme une fonction dans une macro exel
    Par ERICKO dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/10/2007, 23h39
  4. Réponses: 8
    Dernier message: 07/05/2006, 18h35
  5. Réponses: 3
    Dernier message: 27/08/2003, 21h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo