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 :

[Python 3] Programme qui ce lance au demarrage dans le zone de notification [Python 3.X]


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut [Python 3] Programme qui ce lance au demarrage dans le zone de notification
    Bonjour

    Je souhaite réaliser un programme qui indique l'état d'un réseau dans la zone de notification de windows(8) prés de l'horloge. L'icone dans la zone change de couleur en fonction de l’état du réseau (rouge orange ou vert) , pour faire varier cette je passe par un serveur.
    En gros:
    -Le client (celui qui affiche l'icone d’état) allume sont Pc, a ce moment la le programme ce lance et envoie une requête au serveur pour connaitre l’état du réseau.
    -Le serveur stock l'ip du client et répond a la requête.
    -En fonction de la réponse du serveur l'icone est Vert, Orange ou Rouge.
    -Le serveur dispose d'une interface qui permet de changer l’état réseaux (V, O, R), a chaque modification le serveur envoie un message a tout les clients pour indiquer le changement (on utilise les ip précédemment stocker).
    -Le client lorsqu'il reçoit un message d'état de la part du serveur adapte la couleur de l'icone dans la zone de notification.

    -Toute les heures le serveur envoie une requête a chaque client pour savoir si il est encore connecté afin d’éviter d'envoie des messages d'états a des clients ayant éteint leur ordinateur par exemple.

    Je sait faire le serveur ainsi que la partie réseau (Tkinter et Socket grâce a ma bataille navale réaliser en ISN cette année) par conte pour le client aucune idée de part ou commencer. Quel librairie utiliser pour les parties icônes dans la zones de notification, comment installer cette bibliothèque...

    Je suis un gros débutant de python je ne connais que la version 3
    J'ai trouver des programme semblable mais ils étaient en python 2 donc je ne maîtrise pas les différences et puis il n'avait en comment avec mon programme que d'afficher un icone dans la zone de notification, enfin bref je n'est rien compris a leur code ^^


    Merci de votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 239
    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 239
    Points : 36 692
    Points
    36 692
    Par défaut
    Salut,

    A priori, c'est de la programmation système. Si vous voulez trouver des pistes pour voir comment coder cela en natif sous windows, les mots clés sont "python", "windows", "systray". Vous risquz de trouvez des exemples plus ou moins facile à adapter comme par exemple celui-ci .
    Sinon, vous pouvez toujours regarder ce que sait faire le framework PyQt dans ce domaine: la documentation est ici. Et si tyrtamos passe dans le coin, il vous donnera certainement l'adresse d'un tuto. fait maison.

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

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par wiztricks Voir le message
    Et si tyrtamos passe dans le coin, il vous donnera certainement l'adresse d'un tuto. fait maison.
    Eh oui, j'étais dans le coin!

    J'utilise cette technique pour rendre disponible en permanence une console Python que j'utilise comme une calculatrice scientifique. En plus, ce programme est rendu autonome par un traitement avec cx_freeze, ce qui fait qu'on peut l'utiliser sur un PC qui n'a pas Python d'installé (ou qui n'a pas la bonne version). Je trouve ça très pratique.

    Le programme est lancé au boot et une icône vient sur la zone de notification. Un clic souris sur cette icône fait afficher la fenêtre du programme. Un clic de fermeture (la croix de la fenêtre) semble fermer la fenêtre mais en fait la rend invisible. Un clic droit sur l'icône permet de fermer effectivement le programme.

    Mon tuto est là: http://python.jpvweb.com/mesrecettes...t4_system_tray.

    Ce tuto date un peu (Python 2.7 et PyQt4), mais je peux le moderniser (le programme que j'utilise maintenant est avec Python 3.4 et PyQt5) et si nécessaire le simplifier.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    J'avais justement utiliser une de tes reponses pour un post du meme genre pour essayer de resoudre mon probleme mais comme ton code est en python 2 il y a quelque suptiliter que je ne comprend pas bien et surtout je n'est pas réussi a installer la bibliotheque pour executer le code et essayer de mieux comprendre... Et le pire google a beau être mon amis pas possible de trouver un tuto pour installer la biblio (je cherchait pour python 3 ce qui a ete surment mon erreur).

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Commence par le début: quel OS?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    moi je suis sous W10 mais les pc sur lequel je compte mettre ça sont sous 8

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Même sous Windows 64 bits, je n'utilise que du Python 32 bits.

    Python v3.4.3 32bits python-3.4.3.msi ici: https://www.python.org/downloads/

    PyQt5 v5.5 32 bits PyQt5-5.5-gpl-Py3.4-Qt5.5.0-x32.exe ici: http://www.riverbankcomputing.com/so...pyqt/download5

    Il faut installer Python avant PyQt5

    Dis-moi quand c'est fait (la suite demain!).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'ai profité de ce fil pour mettre à jour mon tuto du systemtray avec Python 3.4 et PyQt5 v5.5, y compris avec le traitement par cx_freeze:

    http://python.jpvweb.com/mesrecettes...t4_system_tray

    Ça devrait te faire gagner du temps.

    Essaie déjà d'appliquer au programme de test que je te donne pour te faire la main. Tu comprendras mieux comment l'adapter à ton projet.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    à titre indicatif, un exemple de tray icon minimaliste, via l'api win32 directement (sans lib additionnelle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import win32gui, win32con, time
     
    wc = win32gui.WNDCLASS()
    hinst = wc.hInstance = win32gui.GetModuleHandle(None)
    wc.lpszClassName = "maclasse"
    classAtom = win32gui.RegisterClass(wc)
    style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
    hwnd = win32gui.CreateWindow( classAtom, "fenetre", style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None)
    win32gui.UpdateWindow(hwnd)
    hicon = win32gui.LoadIcon(0, win32con.IDI_APPLICATION)
    nid = (hwnd, 0, win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP, win32con.WM_USER+20, hicon, "tooltip")
    win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid)
    win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, (hwnd, 0, win32gui.NIF_INFO, win32con.WM_USER+20, hicon, "tooltip", "je suis dans les tray icons"))
    time.sleep(30)  # reste 30 secondes dans les trays puis termine
    win32gui.DestroyWindow(hwnd)
    nid = (hwnd, 0)
    win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, nid)
    win32gui.PostQuitMessage(0)
    j'ai pas encore eu trop l'occasion de me pencher sur la question, jusqu'ici je faisais la même chose que tyrtamos mais avec Gtk (ça marche bien aussi), ce qui m'embête justement c'est de devoir installer une lib additionnelle sous windows (tout ça pour... un notificateur IRC, sisi )

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 239
    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 239
    Points : 36 692
    Points
    36 692
    Par défaut
    Salut,

    Citation Envoyé par BufferBob Voir le message
    à titre indicatif, un exemple de tray icon minimaliste, via l'api win32 directement (sans lib additionnelle) :
    Les modules permettant l'accès aux API win32 ne sont pas inclus dans Python en standard. Il faut quand même installer pywin32 qu'on peut aussi récupérer chez Gohlke ou qui vient avec certaines distributions de Python sur Windows (ActiveState).

    Mais je suis d'accord, c'est un peu dommage d'installer un framework graphique comme Qt ou GTK pour juste disposer de cette fonctionnalité là: même si on cherche la portabilité, les moutures natives sont pas si mal documentées et plein d'exemples sont disponibles pourvu qu'on sache chercher.

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

  11. #11
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Je suis d'accord aussi si le problème ne concerne que Windows: le code proposé est vraiment très concis (mais aussi très complexe).

    Les bibliothèques graphiques (PyQt, PyGtk, ...) ont cependant le gros avantage de rendre facile le codage multiplateforme: ainsi, le code de mon tuto marche sous Linux si on renomme simplement les 2 fichiers .pyw => .py (je n'ai pas essayé sous Mac OS X).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  12. #12
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Les modules permettant l'accès aux API win32 ne sont pas inclus dans Python en standard. Il faut quand même installer pywin32
    exact, j'avais complètement zappé ce détail et c'est clair qu'en termes de complexité l'api win se pose là par rapport aux toolkits linux

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut Soucis sur l'update
    Bonjour a tous, cela fait longtemps, merci pour vos réponse le projet avance plutôt bien mais je n'en suit toujours pas a créer l'icone donc je vous parlais au debut la je bloque sur l'update de l’état réseau coter serveur, j'ai deux version du serveur l'une ou il plante des le début (cf code serveur 1) et l'autre ou quand je fait varier la variable Etat_reseau "cela ne ce propage pas a travers les thread". Je préfère la solution du serveur 1 mais je ne comprend pas le pourquoi de l'erreur, notre bonne amis google ne me trouve que des personne ou le problème est lier a tkinter donc je ne voie pas la rapport avec le mien.

    Dans serveur1 Etat_reseau est une StringVar() et dans serveur2 un variable de type string.

    Serveur 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "C:\Users\arthu\Desktop\Projet Papa\Serveur.py", line 9, in <module>
        Etat_reseau = StringVar()
      File "C:\Python34\lib\tkinter\__init__.py", line 332, in __init__
        Variable.__init__(self, master, value, name)
      File "C:\Python34\lib\tkinter\__init__.py", line 236, in __init__
        self._root = master._root()
    AttributeError: 'NoneType' object has no attribute '_root'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    import socket
    import threading
    from tkinter import *
     
    global Client_online, Etat_reseau
     
    Client_online = []
     
    Etat_reseau = StringVar()
    Etat_reseau.set("Bon") #0: bon 1:moyen 2:mauvais
     
     
    def Etat_0():
        Etat_reseau.set("Bon")
        print("Update", Etat_reseau.get())
     
    def Etat_1():
        Etat_reseau.set("Moyen")
        print("Update", Etat_reseau.get())
     
    def Etat_2():
        Etat_reseau.set("Mauvais")
        print("Update", Etat_reseau.get())
     
     
    class ClientThread(threading.Thread):
     
        def __init__(self, ip, port, clientsocket, Etat_reseau):
     
            threading.Thread.__init__(self)
            self.ip = ip
            self.port = port
            self.clientsocket = clientsocket
            print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))
            Client_online.append(ip)
     
        def run(self):
     
            nb_send = 0
            paquet = ""
     
            self.Etat_reseau_client = StringVar()
            self.Etat_reseau_client.set("none")
            #print("Etat_reseau_client ",self.Etat_reseau_client)
     
            print("ConnecTion de %s %s" % (self.ip, self.port, ))
     
     
            print("HH", Etat_reseau, self.Etat_reseau_client)
     
            while True: #Envoie l'etat seulement lors d'une update ou du premier cycle(le client ne connais pas l'etat)
     
                print("tt", Etat_reseau.get(), self.Etat_reseau_client.get())
                if Etat_reseau.get() != self.Etat_reseau_client.get() or nb_send == 0:
     
                    nb_send = nb_send + 1
     
                    #print('ici')
                    self.Etat_reseau.set(Etat_reseau.get())
                    paquet = str(str(self.Etat_reseau.get()) + chr(0)).encode('latin-1')
                    self.clientsocket.send(paquet)
     
                    #print('la')
                    #self.Etat_reseau_client.set(Etat_reseau)
                    print("nb_send", nb_send)
     
            print("Client ",self.ip, "déconnecté...")
     
    class MenuEtat(threading.Thread): #La fenetre qui doit permettre de changer l'etat reseau
     
        def __init__(self):
     
            threading.Thread.__init__(self)
     
        def run(self):
     
            #print("test")
     
            fenetre_choix = Tk()
            fenetre_choix.title("Panel d'administration")
            fenetre_choix.configure(bg = "#00B3D7")
     
            button_heber = Button(fenetre_choix, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0, bg = "white", relief=FLAT)
            button_rej = Button(fenetre_choix, text = "Perturbation connue sur le reseau",font="arial 12 bold", command=Etat_1, bg = "white", relief=FLAT)
            button_ia = Button(fenetre_choix, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2, bg = "white", relief=FLAT)
            taille_x_l = Label(fenetre_choix, bg = "#00B3D7")
            taille_y_b = Label(fenetre_choix, bg = "#00B3D7")
            info_ip = Label(fenetre_choix, text = "Quelle est l'etat du reseau ?", bg = "#00B3D7")
     
            taille_x_l.pack(side=TOP,padx=380,pady=20)
            button_heber.pack(side=TOP,padx=50,pady=10)
            button_rej.pack(side=TOP,padx=50,pady=10)
            button_ia.pack(side=TOP,padx=50,pady=10)
            taille_y_b.pack(side=TOP,pady=80)
            info_ip.pack(side=BOTTOM)
     
            fenetre_choix.mainloop()
     
     
     
    newthread_fenetre = MenuEtat()
    newthread_fenetre.start()
     
    tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcpsock.bind(("",50000))
     
    while True:
        tcpsock.listen(10)
        print( " En écoute...")
        (clientsocket, (ip, port)) = tcpsock.accept()
        newthread = ClientThread(ip, port, clientsocket, Etat_reseau)
        newthread.start()
    Serveur 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    import socket
    import threading
    from tkinter import *
     
    global Client_online, Etat_reseau
     
    Client_online = []
     
    Etat_reseau = "Bon" #0: bon 1:moyen 2:mauvais
     
     
    def Etat_0():
        Etat_reseau = "Bon"
        print("Update", Etat_reseau)
     
    def Etat_1():
        Etat_reseau = "Moyen"
        print("Update", Etat_reseau)
     
    def Etat_2():
        Etat_reseau = "Mauvais"
        print("Update", Etat_reseau)
     
     
    class ClientThread(threading.Thread):
     
        def __init__(self, ip, port, clientsocket, Etat_reseau):
     
            threading.Thread.__init__(self)
            self.ip = ip
            self.port = port
            self.clientsocket = clientsocket
            print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))
            Client_online.append(ip)
     
        def run(self):
     
            nb_send = 0
            paquet = ""
     
     
     
            self.Etat_reseau_client = StringVar()
            self.Etat_reseau_client.set("none")
            #print("Etat_reseau_client ",self.Etat_reseau_client)
     
            print("ConnecTion de %s %s" % (self.ip, self.port, ))
     
     
            print("HH", Etat_reseau, self.Etat_reseau_client.get())
     
            while True: #Envoie l'etat seulement lors d'une update ou du premier cycle(le client ne connais pas l'etat)
     
                self.Etat_reseau = Etat_reseau
                print("            self.Etat_reseau",  self.Etat_reseau)
     
                print("tt", self.Etat_reseau, self.Etat_reseau_client.get())
                if Etat_reseau != self.Etat_reseau_client.get() or nb_send == 0:
     
                    nb_send = nb_send + 1
     
                    #print('ici')
                    self.Etat_reseau_client.set(Etat_reseau)
                    paquet = str(str(self.Etat_reseau) + chr(0)).encode('latin-1')
                    self.clientsocket.send(paquet)
     
                    #print('la')
                    #self.Etat_reseau_client.set(Etat_reseau)
                    print("nb_send", nb_send)
     
            print("Client ",self.ip, "déconnecté...")
     
    class MenuEtat(threading.Thread): #La fenetre qui doit permettre de changer l'etat reseau
     
        def __init__(self):
     
            threading.Thread.__init__(self)
     
        def run(self):
     
            #print("test")
     
            fenetre_choix = Tk()
            fenetre_choix.title("Panel d'administration")
            fenetre_choix.configure(bg = "#00B3D7")
     
            button_heber = Button(fenetre_choix, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0, bg = "white", relief=FLAT)
            button_rej = Button(fenetre_choix, text = "Perturbation connue sur le reseau",font="arial 12 bold", command=Etat_1, bg = "white", relief=FLAT)
            button_ia = Button(fenetre_choix, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2, bg = "white", relief=FLAT)
            taille_x_l = Label(fenetre_choix, bg = "#00B3D7")
            taille_y_b = Label(fenetre_choix, bg = "#00B3D7")
            info_ip = Label(fenetre_choix, text = "Quelle est l'etat du reseau ?", bg = "#00B3D7")
     
            taille_x_l.pack(side=TOP,padx=380,pady=20)
            button_heber.pack(side=TOP,padx=50,pady=10)
            button_rej.pack(side=TOP,padx=50,pady=10)
            button_ia.pack(side=TOP,padx=50,pady=10)
            taille_y_b.pack(side=TOP,pady=80)
            info_ip.pack(side=BOTTOM)
     
            fenetre_choix.mainloop()
     
     
     
    newthread_fenetre = MenuEtat()
    newthread_fenetre.start()
     
    tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcpsock.bind(("",50000))
     
    while True:
        tcpsock.listen(10)
        print( " En écoute...")
        (clientsocket, (ip, port)) = tcpsock.accept()
        newthread = ClientThread(ip, port, clientsocket, Etat_reseau)
        newthread.start()
    ah oui j'avais oublier au début voila le code du client si vous voulez

    Client:
    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
     
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion.connect(("localhost", 50000))
     
     
    while True:
            try:
                msgServ = connexion.recv(1024) # on recoit le message
     
                print("message du Serveur", msgServ.decode('latin-1'))
                #paquethandler(msgClient) # on le gére
            except:
                pass

  14. #14
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    Salut,

    Les lignes de code du message d'erreur n'apparaissent pas dans tes scripts.

    Difficile de se prononcer.


    Edit: je n'avais pas fait attention que ça se passait au niveau de Tkinter.

    Tu dois d'abord créer ton instance Tk avant d'utiliser StringVar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    >>> from tkinter import *
    >>> s = StringVar()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.2/tkinter/__init__.py", line 246, in __init__
        Variable.__init__(self, master, value, name)
      File "/usr/lib/python3.2/tkinter/__init__.py", line 177, in __init__
        self._tk = master.tk
    AttributeError: 'NoneType' object has no attribute 'tk'
    >>> f = Tk()
    >>> s = StringVar()

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    quand je lance Serveur 1 je l'est pourtant https://i.imgur.com/5gNzyBW.png
    Je renvoie quand meme le code au cas ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    import socket
    import threading
    from tkinter import *
     
    global Client_online, Etat_reseau
     
    Client_online = []
     
    Etat_reseau = StringVar()
    Etat_reseau.set("Bon") #0: bon 1:moyen 2:mauvais
     
     
    def Etat_0():
        Etat_reseau.set("Bon")
        print("Update", Etat_reseau.get())
     
    def Etat_1():
        Etat_reseau.set("Moyen")
        print("Update", Etat_reseau.get())
     
    def Etat_2():
        Etat_reseau.set("Mauvais")
        print("Update", Etat_reseau.get())
     
     
    class ClientThread(threading.Thread):
     
        def __init__(self, ip, port, clientsocket, Etat_reseau):
     
            threading.Thread.__init__(self)
            self.ip = ip
            self.port = port
            self.clientsocket = clientsocket
            print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))
            Client_online.append(ip)
     
        def run(self):
     
            nb_send = 0
            paquet = ""
     
            self.Etat_reseau_client = StringVar()
            self.Etat_reseau_client.set("none")
            #print("Etat_reseau_client ",self.Etat_reseau_client)
     
            print("ConnecTion de %s %s" % (self.ip, self.port, ))
     
     
            print("HH", Etat_reseau, self.Etat_reseau_client)
     
            while True: #Envoie l'etat seulement lors d'une update ou du premier cycle(le client ne connais pas l'etat)
     
                print("tt", Etat_reseau.get(), self.Etat_reseau_client.get())
                if Etat_reseau.get() != self.Etat_reseau_client.get() or nb_send == 0:
     
                    nb_send = nb_send + 1
     
                    #print('ici')
                    self.Etat_reseau.set(Etat_reseau.get())
                    paquet = str(str(self.Etat_reseau.get()) + chr(0)).encode('latin-1')
                    self.clientsocket.send(paquet)
     
                    #print('la')
                    #self.Etat_reseau_client.set(Etat_reseau)
                    print("nb_send", nb_send)
     
            print("Client ",self.ip, "déconnecté...")
     
    class MenuEtat(threading.Thread): #La fenetre qui doit permettre de changer l'etat reseau
     
        def __init__(self):
     
            threading.Thread.__init__(self)
     
        def run(self):
     
            #print("test")
     
            fenetre_choix = Tk()
            fenetre_choix.title("Panel d'administration")
            fenetre_choix.configure(bg = "#00B3D7")
     
            button_heber = Button(fenetre_choix, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0, bg = "white", relief=FLAT)
            button_rej = Button(fenetre_choix, text = "Perturbation connue sur le reseau",font="arial 12 bold", command=Etat_1, bg = "white", relief=FLAT)
            button_ia = Button(fenetre_choix, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2, bg = "white", relief=FLAT)
            taille_x_l = Label(fenetre_choix, bg = "#00B3D7")
            taille_y_b = Label(fenetre_choix, bg = "#00B3D7")
            info_ip = Label(fenetre_choix, text = "Quelle est l'etat du reseau ?", bg = "#00B3D7")
     
            taille_x_l.pack(side=TOP,padx=380,pady=20)
            button_heber.pack(side=TOP,padx=50,pady=10)
            button_rej.pack(side=TOP,padx=50,pady=10)
            button_ia.pack(side=TOP,padx=50,pady=10)
            taille_y_b.pack(side=TOP,pady=80)
            info_ip.pack(side=BOTTOM)
     
            fenetre_choix.mainloop()
     
     
     
    newthread_fenetre = MenuEtat()
    newthread_fenetre.start()
     
    tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcpsock.bind(("",50000))
     
    while True:
        tcpsock.listen(10)
        print( " En écoute...")
        (clientsocket, (ip, port)) = tcpsock.accept()
        newthread = ClientThread(ip, port, clientsocket, Etat_reseau)
        newthread.start()

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    je ne comprend pas pourquoi f influe sur s, et puis StringVar() est lier a Tkinter? c pas du "python de base"?

  17. #17
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 298
    Points : 6 778
    Points
    6 778
    Par défaut
    C'est ce qui arrive quand on importe à l'aveugle.

    http://effbot.org/tkinterbook/variable.htm

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Merci , c surtout mon "prof" d'ISN qui nous a apprit a l'aveugle^^ c pas grace a lui que j'ai achever mon jeu pour le bac.

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    J'ai une erreur plus complexe cette fois ci (de mon point de vue en tout cas), j'ai corriger l'erreur au début mais ça m'en a découvert une autre qui pourtant n'a pas lieu dans Serveur2 alors que cette partie du code est identique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    >>> ================================ RESTART ================================
    >>> 
     En écoute...
    [+] Nouveau thread pour 127.0.0.1 53867
     En écoute...
    Exception in thread Thread-2:
    Traceback (most recent call last):
      File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
        self.run()
      File "C:\Users\arthu\Desktop\Projet Papa\Serveur.py", line 37, in run
        self.Etat_reseau_client = StringVar()
      File "C:\Python34\lib\tkinter\__init__.py", line 332, in __init__
        Variable.__init__(self, master, value, name)
      File "C:\Python34\lib\tkinter\__init__.py", line 245, in __init__
        elif not self._tk.getboolean(self._tk.call("info", "exists", self._name)):
    RuntimeError: main thread is not in main loop
     
    Exception ignored in: <bound method StringVar.__del__ of <tkinter.StringVar object at 0x037CF370>>
    Traceback (most recent call last):
      File "C:\Python34\lib\tkinter\__init__.py", line 251, in __del__
        if self._tk.getboolean(self._tk.call("info", "exists", self._name)):
    RuntimeError: main thread is not in main loop
    En gros ça plante parceque le string var l.37 est dans un thread?
    J'ai essayer de mettre l'initialisation des threads dans II.mainloop(), j'utilise II comme VinsS utilise f dans son exemple.


    Serveur 1 (Modifier depuis le post precedent):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    import socket
    import threading
    from tkinter import *
     
    global Client_online, Etat_reseau
     
     
    def Etat_0():
        Etat_reseau.set("Bon")
        print("Update", Etat_reseau.get())
     
    def Etat_1():
        Etat_reseau.set("Moyen")
        print("Update", Etat_reseau.get())
     
    def Etat_2():
        Etat_reseau.set("Mauvais")
        print("Update", Etat_reseau.get())
     
     
    class ClientThread(threading.Thread):
     
        def __init__(self, ip, port, clientsocket, Etat_reseau):
     
            threading.Thread.__init__(self)
            self.ip = ip
            self.port = port
            self.clientsocket = clientsocket
            print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))
            Client_online.append(ip)
     
        def run(self):
     
            nb_send = 0
            paquet = ""
     
            self.Etat_reseau_client = StringVar()
            self.Etat_reseau_client.set("none")
            #print("Etat_reseau_client ",self.Etat_reseau_client)
     
            print("ConnecTion de %s %s" % (self.ip, self.port, ))
     
     
            print("HH", Etat_reseau, self.Etat_reseau_client)
     
            while True: #Envoie l'etat seulement lors d'une update ou du premier cycle(le client ne connais pas l'etat)
     
                print("tt", Etat_reseau.get(), self.Etat_reseau_client.get())
                if Etat_reseau.get() != self.Etat_reseau_client.get() or nb_send == 0:
     
                    nb_send = nb_send + 1
     
                    #print('ici')
                    self.Etat_reseau.set(Etat_reseau.get())
                    paquet = str(str(self.Etat_reseau.get()) + chr(0)).encode('latin-1')
                    self.clientsocket.send(paquet)
     
                    #print('la')
                    #self.Etat_reseau_client.set(Etat_reseau)
                    print("nb_send", nb_send)
     
            print("Client ",self.ip, "déconnecté...")
     
    class MenuEtat(threading.Thread): #La fenetre qui doit permettre de changer l'etat reseau
     
        def __init__(self):
     
            threading.Thread.__init__(self)
     
        def run(self):
     
            #print("test")
     
            fenetre_choix = Tk()
            fenetre_choix.title("Panel d'administration")
            fenetre_choix.configure(bg = "#00B3D7")
     
            button_heber = Button(fenetre_choix, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0, bg = "white", relief=FLAT)
            button_rej = Button(fenetre_choix, text = "Perturbation connue sur le reseau",font="arial 12 bold", command=Etat_1, bg = "white", relief=FLAT)
            button_ia = Button(fenetre_choix, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2, bg = "white", relief=FLAT)
            taille_x_l = Label(fenetre_choix, bg = "#00B3D7")
            taille_y_b = Label(fenetre_choix, bg = "#00B3D7")
            info_ip = Label(fenetre_choix, text = "Quelle est l'etat du reseau ?", bg = "#00B3D7")
     
            taille_x_l.pack(side=TOP,padx=380,pady=20)
            button_heber.pack(side=TOP,padx=50,pady=10)
            button_rej.pack(side=TOP,padx=50,pady=10)
            button_ia.pack(side=TOP,padx=50,pady=10)
            taille_y_b.pack(side=TOP,pady=80)
            info_ip.pack(side=BOTTOM)
     
            fenetre_choix.mainloop()
     
     
    Client_online = []
     
    II = Tk()
    Etat_reseau = StringVar()
    Etat_reseau.set("Bon") #0: bon 1:moyen 2:mauvais
     
     
    newthread_fenetre = MenuEtat()
    newthread_fenetre.start()
     
    tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    tcpsock.bind(("",50000))
     
    while True:
        tcpsock.listen(10)
        print( " En écoute...")
        (clientsocket, (ip, port)) = tcpsock.accept()
        newthread = ClientThread(ip, port, clientsocket, Etat_reseau)
        newthread.start()
    II.mainloop()

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 239
    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 239
    Points : 36 692
    Points
    36 692
    Par défaut
    Salut,

    Citation Envoyé par CraZy_U2P Voir le message
    J'ai une erreur plus complexe cette fois ci (de mon point de vue en tout cas), j'ai corriger l'erreur au début mais ça m'en a découvert une autre qui pourtant n'a pas lieu dans Serveur2 alors que cette partie du code est identique.
    Le message est "clair":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RuntimeError: main thread is not in main loop
    Lorsque vous mélanger GUI et threads, le GUI doit être démarré dans le thread principal et... on évite (en principe) de modifier l'état de l'interface graphique depuis les threads (en faisant appel directement aux méthodes des différents widgets).

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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 18
    Dernier message: 08/07/2014, 01h57
  2. Problème de débutant, programme qui ne lance pas
    Par benjani13 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 15/02/2011, 20h17
  3. [python/dcom] macro qui se lance automatiquement
    Par axel584 dans le forum VBA Word
    Réponses: 7
    Dernier message: 29/06/2010, 02h01
  4. Programme qui se lance au démarrage
    Par mathieugut dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/06/2009, 16h22
  5. Programme qui se lance au debut du setup
    Par sam469 dans le forum Outils
    Réponses: 5
    Dernier message: 18/06/2009, 23h34

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