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 :

bug sous win 7 / ok sous linux


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut bug sous win 7 / ok sous linux
    bonjour a tous
    je développe actuellement un programme qui m'affiche un popup si certaines conditions sont remplies
    le programme principal tourne en arrière plan
    on ferme le popup,, un nouveau popup apparait si la condition est remplie...

    sous linux, pas de souci, cela fonctionne comme prévu..

    le meme code sous win7 bugue :

    apres le lancement du programme, des que la condition est remplie, le popup apparait... normal !

    fermeture du popup = ok

    si la condition est de nouveau remplie, pas de popup et utilisation PCU à 100% par python

    arret brutal (en tuant le process)

    voila les faits...

    j'utilise un thread pour gérer le popup de manière a laisser le programme principal faire ses tests ...


    si quelqu'un a une idée..

    merci de votre attention

    Quatre

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par Quatre Voir le message
    j'utilise un thread pour gérer le popup de manière a laisser le programme principal faire ses tests ...


    si quelqu'un a une idée..
    Une idée ? Oui.
    Avec du code vous aurez une réponse.

    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    +1 pour PauseKawa.

    En particulier, il est fortement déconseillé de toucher au graphique avec les threads, et ceci dans toutes les bibliothèques graphiques. Ce seul point peut expliquer les plantages.

    Tyrtamos
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    bonjour
    pas de probleme, voici le code :

    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
     
    #!/usr/bin/env python
    import os
    import threading
    from Tkinter import *
     
    Repertoire = os.getcwd()
     
     
    def popup():
    	fenetre1 = Tk()
    	texte1 = Label(fenetre1, text='Nouveau fichier', fg='red')
    	texte1.pack()
    	bouton1 = Button(fenetre1, text='Fermer', command = fenetre1.quit)
    	bouton1.pack()
    	fenetre1.mainloop()
    	a.exit()
    	fenetre1.destroy()
     
    def MyTimer(tempo):
        threading.Timer(tempo, MyTimer, [tempo]).start()
        controler()
     
     
     
    def initialisation():
    	ListeInitiale = os.listdir(Repertoire)
    	global NbreFichier 
    	NbreFichier = len(ListeInitiale)
     
    def controler():
    	ListeTestee = os.listdir(Repertoire)
    	NbreFichierTeste = len(ListeTestee)
    	global NbreFichier
    	#print "Nbre de fichier de base = " + str(NbreFichier)
    	#print "Nbre de fichier teste = " + str(NbreFichierTeste)
     
    	if NbreFichierTeste < NbreFichier:
    		NbreFichier -= 1
     
    	if NbreFichierTeste > NbreFichier:
    		NbreFichier += 1
    		global a
    		a = threading.Thread(None, popup, None,())	
    		a.start()
     
    def main():
    		initialisation()
    		#print "nbre de base = " + str(NbreFichier)
    		MyTimer(2.0)
     
     
    if __name__ == "__main__":
    	main()
    merci de votre attention

    Quatre

  5. #5
    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,

    Comme l'on dit PauseKawa et tyrtamos, c'est le design qui va pas: l'IHM est "globale", "singleton", non ré-entrante,...
    L'ignorez c'est accepter d'avoir des plantages aléatoires dans des conditions pas très claires: ca marche sous Linux, çà plante sous Windows,...

    Si vous êtes pressé, que vous n'avez pas le temps de ré-écrire votre code après avoir compris les implications de "singleton", une rustine pourrait être d'ajouter a.join() après a.start() dans controler.
    Note: L'intention est qu'à l'instant t, vous n'aurez qu'une seule thread 'active' ce qui peut être suffisant pour garantir "une seule instance d'IHM".
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pour traduire (il est taquin notre wiztricks) c'est la structure du code qui est a revoir.
    Puisque tu souhaite utiliser un timer je te recommande de partir de l'exemple de la FAQ et de rajouter la couche graphique.

    Pour ce qui est de la partie tkinter il est recommandé de n'avoir qu'une instance Tk(). Dans ce sens il serait bien de l'avoir dans le main et d'utiliser un toplevel pour afficher ton message.

    Pour ne pas afficher la fenêtre principale utilise l'overrideredirect() et withdraw().

    Pour le main tu dois le structurer comme ceci:
    instance Tk()
    Instruction pour fermer le thread si on quitte l'instance Tk
    Lancement du thread
    Le mainloop Tk()

    Avec ceci tu auras déjà quelque chose de plus stable.
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    bonsoir
    merci pour vos réponse

    pour info, mon timer est fait a partir de l'exemple de la FAQ -> pas de souci avec lui

    suite à vos conseils, j'ai essayer différentes versions avec une seule instance de Tk (invisible grâce a withdraw et a PauseKawa) associé à toplevel ou tkMessageBox avec ou sans thread d'appel

    sous linux , ça marche a tout les coups
    sous windows, je n'ai jamais l'affichage du popup

    je continue mes recherches....

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pas trop le temps de voir le code aujourd'hui mais juste un passage pour dire qu'il est possible de se passer d'un thread ici.

    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
    try:
        try:
            import tkinter as Tk
        except:
            import Tkinter as Tk
    except:
        raise ImportError('Wrapper Tk non disponible')
    import os
     
    class Foo(Tk.Tk):
        def __init__(self, parent):
            Tk.Tk.__init__(self, parent)
            self.parent = parent
            self._wdrwme()
            self.v = Tk.StringVar()
            Tk.Label(self, textvariable=self.v, fg='red').pack()
            Tk.Button(self, text='Fermer', command = self._wdrwme).pack()
            self.Repertoire = os.getcwd()
            self.ListeInitiale = os.listdir(self.Repertoire)
            self._clb()
            self.mainloop()
     
        def _wdrwme(self):
            self.withdraw()
            self.overrideredirect(1)
     
        def _showme(self):
            if self.wm_state() == 'withdrawn':
                self.overrideredirect(0)
                self.deiconify()
     
        def _clb(self):
            if len(os.listdir(self.Repertoire)) > len(self.ListeInitiale):
                self.ListeInitiale = os.listdir(self.Repertoire)
                self.v.set('Nouveau fichier')
                self._showme()
            elif len(os.listdir(self.Repertoire)) < len(self.ListeInitiale):
                self.ListeInitiale = os.listdir(self.Repertoire)
                self.v.set('Fichier en moins')
                self._showme()
            self.after(200, self._clb)
     
    if __name__ == "__main__":
        Foo(None)
    Bon code.
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonsoir

    merci pour vos contributions, je vais encore me coucher moins bête ce soir !! j'aurai découvert la méthode after...entre autres...


    PauseKawa <- juste une question, le underscore devant les fonctions, c'est une convention personnelle ??


    Quatre
    éleveur de python débutant

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    C'est pour noter une fonction interne.

    Bon code et bonne découverte.
    Merci d'utiliser le forum pour les questions techniques.

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Citation Envoyé par Quatre Voir le message
    PauseKawa <- juste une question, le underscore devant les fonctions, c'est une convention personnelle ??
    C'est une bonne question en fait. Voici ce qui est dit:
    - _single_leading_underscore: weak "internal use" indicator. E.g. "from M
    import *" does not import objects whose name starts with an underscore.

    - single_trailing_underscore_: used by convention to avoid conflicts with
    Python keyword, e.g.

    Tkinter.Toplevel(master, class_='ClassName')

    - __double_leading_underscore: when naming a class attribute, invokes name
    mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

    - __double_leading_and_trailing_underscore__: "magic" objects or
    attributes that live in user-controlled namespaces. E.g. __init__,
    __import__ or __file__. Never invent such names; only use them
    as documented.
    Je l'utilise sans doute à outrance et inutilement dans ce cas.

    @+
    Merci d'utiliser le forum pour les questions techniques.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/06/2015, 07h37
  2. Pb jsp sous unix et pas sous win - OU - Pb tomcat
    Par estelle31 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 03/11/2008, 10h28
  3. programme qui tourne sous win98 et plante sous win xp
    Par serrepate dans le forum Windows
    Réponses: 7
    Dernier message: 24/06/2007, 13h13
  4. GTK+ sous Code::Blocks et sous Win
    Par Shugo78 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 30/04/2007, 23h54
  5. NoClassDefFoundError sous win, mais ok sous linux
    Par robert_trudel dans le forum Général Java
    Réponses: 1
    Dernier message: 15/02/2007, 09h07

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