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 :

comportement surprenant d'un bouton Tk dans un script Python


Sujet :

Tkinter Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    développement de loiciel
    Inscrit en
    Mars 2025
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : développement de loiciel
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2025
    Messages : 1
    Par défaut comportement surprenant d'un bouton Tk dans un script Python
    Bonjour,

    Lorsque je travaillais j'ai développés des interfaces Python/Tk pour générer le fichier des paramètres de calcul de logiciels de simulation ( une cinquarantaine de paramètres dont plus de 30 noms de fichiers de données indispensables au logiciel ) et l'exploitation des fichiers de résultat. C'étaient donc des interfaces comtenant des centaines d'instruction et utilisant toute la puissance de Python et des widgets Tk.
    Maintenant je développe un projet personnel modeste et suit confronté au comportement surprenant d'un simple Bouton Tk: La commande associée au bouton est exécutée une seule fois lors de la création du bouton et jamais lorsque l'on clique sur lui bien qu'il soit affiché, actif, et que son apparence change lors du clic.
    De plus la fonction associée au bouton est de type "type(imprime) =<class 'function''>" avant la création du bouton, puis lors de la création du bouton qui étonnament l'exécute immédiatement "function imprime at 0x000027F72F13F60>', une adresse normale, et après la création du bouton devient "type(imprime) = <class 'NoneType')> None".

    Voici un tout petit script Python de démonstation :
    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
    # python 3.13 (64-bit)
    # tclk86-8.6.7-0
     
    import tkinter
     
    def imprime(texte , niveau = 4 ):
        print(' 7 module14.imprime   impression du texte = ' , texte , ' niveau = ' , niveau , imprime )
     
    root = tkinter.Tk()
    root.width=250
    root.heigt=100
    texte = ' wwww '
    niveau = -2
     
    print(' 15 module14 avant création du bouton imprime qui appelle imprime ' , ' type(imprime) = ' , type(imprime) )
    imprime= tkinter.Button( root , text=" création de imprime l16 "  , command = imprime( texte , niveau=niveau)).place(x=00 , y=50)
    print(' 17 module14 après création du bouton imprime  qui appelle imprime   type(imprime) = ' , type(imprime) , imprime )
     
    root.mainloop()
    et les messages lors de son exécution:

    15 module14 avant création du bouton imprime qui appelle imprime type(imprime) = <class 'function'>
    7 module14.imprime impression du texte = wwww niveau = -2 <function imprime at 0x000001305E143F60>
    17 module14 après création du bouton imprime qui appelle imprime type(imprime) = <class 'NoneType'> None


    Toute aide sera la bienvenue

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 520
    Billets dans le blog
    67
    Par défaut
    Bonjour,

    Je déplace la discussion dans le bon forum

    Perso, j'aurais donné un nom différente au bouton (ex.: btnImprimer)

    Cordialement
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

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

    ..., command = imprime( texte , niveau=niveau),... exécute la fonction imprime avec les paramètres données et assigne son retour au paramètre command.
    Ce retour étant None, pas grand chose va se passer lorsqu'on clique sur le Button.
    On peut y pallier (entre autres) avec lambda: ..., command = lambda: imprime( texte , niveau=niveau),....

    Citation Envoyé par Pillipe Voir le message
    Lorsque je travaillais j'ai développés des interfaces Python/Tk pour générer le fichier des paramètres de calcul de logiciels de simulation ( une cinquarantaine de paramètres dont plus de 30 noms de fichiers de données indispensables au logiciel ) et l'exploitation des fichiers de résultat.
    Vos autres soucis dénotent une certaine incompréhension des variables Python... un peu contradictoire avec cette expérience proclamée mais abordée dans tous les bons tutos.

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

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 520
    Billets dans le blog
    67
    Par défaut
    Ah oui, bien vu.

    Citation Envoyé par Pillipe
    ... après création du bouton imprime qui appelle imprime type(imprime) = <class 'NoneType'> None
    tkinter.Button( root , text=" création de imprime l16 " , command = imprime( texte , niveau=niveau)) créé l'objet Button, et après la création du bouton sa méthode .place(x, y) renvoie None.
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 664
    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 664
    Par défaut
    Citation Envoyé par User Voir le message
    et après la création du bouton sa méthode .place(x, y) renvoie None.
    La règle (généralement) suivie par les bibliothèques standards est que les méthodes des objets mutables retourne None alors que celles des objets non-mutable retournent l'objet (et peuvent être chainées ie permettent d'écrire x.m1().m2().m3()).

    Après comme il n'est pas utile de garder une référence aux instances de widgets tkinter (sauf à devoir y accéder plus tard), on pourra se contenter d'une simple instruction tk.Button(...).place() mais garder une référence demandera d'écrire 2 lignes: une pour récupérer l'instance, l'autre pour modifier son état.

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

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 520
    Billets dans le blog
    67
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    La règle (généralement) suivie par les bibliothèques standards est que les méthodes des objets mutables retourne None alors que celles des objets non-mutable retournent l'objet (et peuvent être chainées ie permettent d'écrire x.m1().m2().m3()).
    ...
    Bon à savoir car ce genre de code peut prêter à confusion.
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

Discussions similaires

  1. comment chopper le nb de lignes d'une table dans un script python?
    Par Mydriaze dans le forum Général Python
    Réponses: 9
    Dernier message: 21/12/2007, 14h16
  2. Utilisation de C++ dans un script python.
    Par Ekinoks dans le forum Interfaçage autre langage
    Réponses: 8
    Dernier message: 18/01/2007, 19h03
  3. import dans les script python (objet zope)
    Par cronos6 dans le forum Zope
    Réponses: 5
    Dernier message: 10/09/2006, 14h47
  4. Radio boutton dans un script python
    Par Abla23 dans le forum Zope
    Réponses: 17
    Dernier message: 12/07/2006, 17h12
  5. Réponses: 3
    Dernier message: 05/04/2005, 14h26

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