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 :

Porté variable avec tkinter et root.destroy [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut Porté variable avec tkinter et root.destroy
    Bonjour,
    Il ce passe quelque chose que je ne comprends pas.
    Dans le code suivant les variables globale res et resultat change bien dans les fonctions mais pas en globale.

    Je cherche à faire en sorte que lors d'un click sur non ou bien pas de réponse après x temps il y a une fermeture automatique de la msgbox puis fermeture du programme.
    Il sera déployé sur poste windows avec un passage en exe avec auto-py-to-exe.

    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
    import tkinter as tk
    import subprocess
    from tkinter import messagebox as msgb
    import time
    import sys
     
    root = tk.Tk()
    root.withdraw()
     
    res = True
    quitter = False
     
    if len(sys.argv) == 3:
        #en seconde
        t1 = int(sys.argv[1]) * 60
        #en milli seconde
        t2 = int(sys.argv[2]) * 1000
    elif len(sys.argv) == 2:
        print("param 1 temps avant la fenêtre (en minutes), param 2 temps de la fenêtre (en secondes)")
        quit()
    else:
        t1 = 5
        t2 = 10000
     
    def kill():
        result = subprocess.call("kill.bat", shell=True)
        quitter = True
     
    def showMessage(message, timeout=t2):
        try:
            root.after(timeout, root.destroy)
            res = msgb.askyesno('Info', message, master=root)
            if(res == False):
                kill()           
        except:
            pass
     
    while res:
        time.sleep( t1 )
        showMessage('Voulez-vous continuer à consulter ce titre ?')
        print(res)
        root = tk.Tk()
        root.attributes('-topmost',True)
        root.withdraw()
        print(quitter)
        if(quitter == True):
            quit()
    Quand j'execute le script je passe bien dans kill, donc res passe bien à False, mais apres il repasse à True et donc ma boucle ne finie jamais.
    Idem avec quitter.

    Je suis sous win7 avec python 3.7.9.

    A mon avis c'est la porté de la variable ou alors une recréation de la variable avec le withdraw mais je n'arrive pas à contourner.
    J'ai essayé avec quit, exit à plusieurs endroit et cela ne change pas.

    Si vous avez une idée je suis preneur, je ne suis pas attaché à tkinter toute autre gestionnaire de fenêtre me va aussi.

    Bonne journée.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Salut,

    Oui c'est un problème de "portée des variables".... donc on ouvre son tuto. préféré au chapitre ad hoc (merci la table des matières) et on révise un peu.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 817
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par klyyss Voir le message
    Dans le code suivant les variables globale res et resultat change bien dans les fonctions mais pas en globale.
    La variable "resutat" n'existe pas, les seules globales sont "res" et "quitter"

    Citation Envoyé par klyyss Voir le message
    A mon avis c'est la porté de la variable ou alors une recréation de la variable avec le withdraw mais je n'arrive pas à contourner.
    J'ai essayé avec quit, exit à plusieurs endroit et cela ne change pas.
    Quand tu crées une variable de même nom qu'une globale dans une fonction
    • si la globale n'a pas été utilisée, ça crée une variable locale à la fonction (la globale existe toujours mais n'est alors plus accessible)
    • si la globale a été utilisée au préalable de quelque manière que ce soit (exemple print(res)), ça la rend accessible à la fonction mais en lecture seule et en tentant d'en créer une autre, Python s'imagine que tu veux la modifier et tu obtiens un UnboundLocalError

    La seule façon de modifier une globale dans une fonction est de commencer par demander son accès plein via global nom_de_la_variable.
    => https://frederic-lang.developpez.com...riables#LXII-2
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 319
    Par défaut
    bonjour
    Citation Envoyé par klyyss Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    quitter = False
     
    def kill():
        result = subprocess.call("kill.bat", shell=True)
        quitter = True
     
    print(quitter)
    Normal que cela ne fonctionne pas, voir dans un tuto : la portée des variables ...
    ici quitter dans kill() est une nouvelle/autre variable locale

  5. #5
    Membre Expert
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 918
    Billets dans le blog
    7
    Par défaut
    Bonjour,
    Citation Envoyé par klyyss

    Je cherche à faire en sorte que lors d'un click sur non ou bien pas de réponse après x temps il y a une fermeture automatique de la msgbox puis fermeture du programme.
    messagebox ne permet pas une temporisation pour une fermeture automatique . Construit plutôt ton widget depuis un Toplevel...
    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
    import tkinter as tk
    import sys
     
     
    root = tk.Tk()
    root.withdraw()
    if len(sys.argv) == 3:
        #en seconde
        t1 = int(sys.argv[1])
        t2 = int(sys.argv[2])
    elif len(sys.argv) == 2:
        print("param 1 temps avant la fenêtre (en minutes), param 2 temps de la fenêtre (en secondes)")
        quit()
    else:
        t1 = 3 
        t2 = 5
     
     
    def ask(text):
        frame = tk.Toplevel()
        frame.grid()
        label = tk.Label(frame, text=text)
        label.grid()
        bt = tk.Button(frame, text="Non", command= root.destroy)
        bt.grid()
     
    def message():
        ask('Voulez-vous continuer à consulter ce titre ?')
        root.after(t2*1000, root.destroy)
    root.after(t1*1000, message)
     
    root.mainloop()

  6. #6
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Ho punaise le global.
    Comment j'ai pus l'oublier.

    Merci beaucoup pour le coup de main.

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

Discussions similaires

  1. Portée de variables avec require_once
    Par aertys dans le forum Langage
    Réponses: 5
    Dernier message: 01/10/2014, 20h28
  2. [Tkinter] Renvoyer une variable avec un button
    Par Zl4T_59 dans le forum Tkinter
    Réponses: 4
    Dernier message: 30/04/2014, 09h53
  3. variable avec portée sur fiche
    Par looping dans le forum Langage
    Réponses: 5
    Dernier message: 11/04/2013, 20h48
  4. Portée variables avec HTTPService addEventListener
    Par Clezio dans le forum ActionScript 3
    Réponses: 8
    Dernier message: 09/06/2010, 10h03
  5. retenir une variable cree avec Tkinter
    Par Invité dans le forum Général Python
    Réponses: 5
    Dernier message: 15/10/2009, 14h12

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