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

Tkinter Python Discussion :

"can't invoke wm command application has been destroyed"


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut "can't invoke wm command application has been destroyed"
    Bonjour @tous.

    J'ai un souci d'utilisation du module tkinter.

    J'ai réalisé un script qui permet de lire et de modifier un fichier Excel.

    Si j'inscris le nom du fichier en dur dans le code, le traitement se déroule sans accroc, mais étant donné que je n'aurais par forcément le même fichier à chaque fois j'ai souhaité mettre en place une boîte de dialogue via le module tkinter.filedialog.

    A partir de ce moment-là, j'ai commencé à avoir des soucis d’utilisation avec notamment le message : "can't invoke wm command application has been destroyed"

    Ce message apparait au moment ou je rentre dans le def code() pour la première fois, une fois que je valide la box :

    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
    import os
    from tkinter import *
    from tkinter.messagebox import *
    from tkinter.filedialog import askopenfilename
    import openpyxl
    from openpyxl import *
    from openpyxl.utils import get_column_letter
     
    inputbox = Tk()
    inputbox.withdraw()
    file_path = filedialog.askopenfilename(filetypes=[("Fichier Excel", "*.xlsx;*.xls"),("Fichier CSV", "*.csv"),("All files", "*.*")])
    var_path = str(file_path)
     
    wb= Workbook()
    wb= openpyxl.load_workbook(var_path)
     
    # On active l'onglet courant et on le renomme
    ws = wb.active
    var_titre = ws.title
    ws.title = 'old'
     
    # On crée un nouvel onglet et on le renomme
    ws1 = wb.create_sheet()
    ws1.title = var_titre
     
    # Préparation des fenêtres d'interface utilisateur
    def code():
        print(Code.get())
        if Code.get() == '':
            showwarning('Résultat','Code incorrect.\nVeuillez recommencer !')
            Code.set('')
        else:
            var_code_insee=int(Code.get())
            ws.cell(column=var_col, row=row, value=var_code_insee)
            inputbox.destroy()
     
    # On s'apprête à parcourir la colonne B
    begrow = 1
    endrow = ws.max_row
    endrows1 = 0
    endrows1_incrementation = 0
    for row in range(begrow,endrow):
        if endrows1 > 1:
            endrows1_incrementation = endrows1 - 5
            endrows1 = endrows1_incrementation
     
        # CAS 1.1 : Le code n'est pas renseigné dans la colonne A alors, on demande à l'utilisateur de le renseigner
        if ws['A' + format(row)].value is None and ws['B' + format(row)].value is not None:
                # On gére les paramétre de la boîte de dialogue
                inputbox.deiconify()
                inputbox.title('Code non renseigné')
     
                #Déclaration des variables nécessaires au traitement
                var_col = 1
     
                # Création d'un Label
                Label1 = Label(inputbox, text='Code de : ' + ws['B' + format(row)].value)
                Label1.pack(side = LEFT, padx = 5, pady = 5)
     
                # Création du champ de saisie
                Code= StringVar()
                Champ = Entry(inputbox,textvariable= Code, bg ='bisque', fg='maroon')
                Champ.focus_set()
                Champ.pack(side = LEFT, padx = 5, pady = 5)
     
                #Création d'un bouton de Validation
                Bouton = Button(inputbox, text ='Valider', command = code)
                Bouton.pack(side = LEFT, padx = 5, pady = 5)
    Auriez-vous une idée de ce qui n'est pas écrit correctement ? (ordre, code...)

    En vous remerciant par avance.

    Geo-x

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

    ligne 35, vous avez écrit: inputbox.destroy(). Après çà, "application has been destroyed" est assez cohérent, non?

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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour wiztricks.

    J'aimerais tant que ce soit si cohérent !

    Si je n'applique pas de destroy(), la fenêtre reste ouverte, et boucle sur elle-même.

    Il semblerait que le problème à prendre ne compte vienne plus de cette partie du message : "can't invoke wm command(...)

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

    Citation Envoyé par Geo-x Voir le message
    J'aimerais tant que ce soit si cohérent !

    Si je n'applique pas de destroy(), la fenêtre reste ouverte, et boucle sur elle-même.

    Il semblerait que le problème à prendre ne compte vienne plus de cette partie du message : "can't invoke wm command(...)
    C'est cohérent avec le code que vous avez écrit.
    Le problème est que vous ne pouvez pas utiliser un GUI (tkinter est un GUI) comme vous le faites.

    En lisant votre code, on peut imaginer que vous voulez qu'une boîte de dialogue s'affiche lorsque vous trouvez un champ non/mal renseigné. Une des réponses pourrait vous orienter sur la lecture de ce petit tutoriel sur les boîtes de dialogues. Suivant votre niveau, çà vous suffira ou pas pour avancer...
    Et si çà ne suffit pas, il vous faut prendre le temps d'ouvrir un des tutos qui ont été mis à disposition.

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

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Points : 604
    Points
    604
    Par défaut
    Bonjour,

    Ce message vous indique que le script ne peut plus invoquer de commande impliquant votre fenêtre inputbox ("Can`t invoke wm command") puisqu'à ce stade, elle a déjà été détruite ("application has been destroyed")

    Comme vous l'indique wiztricks, la structure de votre code ne colle pas à ce que vous semblez vouloir faire. Une GUI bloque votre code jusqu’à ce qu'un évènement utilisateur vienne déclencher une série de commandes.

    Dans votre code, vous appelez votre fonction code et devez détruire la fenêtre inputbox afin que d'autres commandes puissent s’exécuter. Du coup, lorsque votre code essaye d'appeler des actions rattachées de votre fenêtre inputbox après qu'elle ait été détruite, vous obtenez ce message d'erreur


    msg edité (il y a eu une autre réponse entre temps)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Merci !
    Un grand merci à vous killian68 et wiztricks, pour vos contributions.

    J'ai, en effet, redéclaré en début de cas mon input_box et ça semble fonctionner.

    Encore merci pour tout.

    Geo-x

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

Discussions similaires

  1. "can't invoke wm command application has been destroyed"
    Par Geo-x dans le forum Général Python
    Réponses: 4
    Dernier message: 05/08/2016, 10h03
  2. "can't invoke wm command application has been destroyed"
    Par flcarnot2013 dans le forum Tkinter
    Réponses: 4
    Dernier message: 14/02/2015, 19h11
  3. ASP.NET the network BIOS command limit has been reached
    Par hottnikks_79 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 04/11/2011, 16h27
  4. Problème à l'export d'un plugin: "No application id has been found"
    Par manimal31 dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 10/11/2009, 08h39
  5. Réponses: 2
    Dernier message: 11/08/2008, 17h24

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