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 :

indice boutons ou récupérer variable texte


Sujet :

Python

  1. #1
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut indice boutons ou récupérer variable texte
    bonjour à tous,

    dans une application, je crée des boutons à l'aide d'une boucle for,
    les boutons sont crées comme prévu, et je voudrais récupérer l'indice de chaque bouton,
    je n'y arrive pas, j'ai épluché le web et les docs, j'y ai passé la nuit, pouvez vous s'il plaît éclairer ma lanterne, est-ce une bonne méthode pour créer des boutons ?

    dans la fonction actBouton(self), je voudrais récupérer le texte de chaque
    boutons contenu dans la liste self.alphab

    par avance merci !

    voici mon code :
    import tkinter

    class MonAppli(tkinter.Tk):
    def __init__(self, parent):
    tkinter.Tk.__init__(self, parent)
    self.parent = parent
    self.initialize()

    def initialize(self):
    self.grid()
    self.geometry("600x200+10+10")

    # le texte des boutons
    self.alphab = ["a","â","b","c","ç","d","e","é","è","ê","ë","f"
    ,"g","h","i","î","ï","j","k","l","m","n","o","ô","p","q"
    ,"r","s","t","u","û","v","w","x","y","z"]

    self.fram1 = tkinter.Frame(self, bg="#FFD100")
    self.fram1.pack(side="top",fill="x")

    self.btPri = {}
    for i in range(36):
    self.btPri[i] = tkinter.Button(self.fram1, text=self.alphab[i], width = 2, height = 2, padx = 3, pady = 3,command=self.actBouton).grid(row=0,column=i)

    self.textPriVariable = tkinter.StringVar()
    self.textPri = tkinter.Label(self.fram1, textvariable=self.textPriVariable).grid(row=1,column=0)

    def actBouton(self):
    self.textPriVariable.set("bouton cliqué")


    if __name__ == "__main__":
    app = MonAppli(None)
    app.title("mon application")
    app.mainloop()
    Fichiers attachés Fichiers attachés

  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,
    En ecrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.btPri[i] = tkinter.Button(self.fram1, text=self.alphab[i], width = 2, height = 2, padx = 3, pady = 3,command=self.actBouton).grid(row=0,column=i)
    self.btPri[i] contiendra le retour de l'appel a la méthode /.grid/ et ce sera None.
    Essayez de faire ca en 2 lignes: instancier le Button et stocker dans BtPri puis faire l'appel a .grid
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut
    tout d'abord merci d'avoir consacré du temps à ma requête,
    j'avais auparavant vérifié que
    self.btPri[i] contiend le retour de l'appel a la méthode /.grid/ -----> None.
    mais comment instancier 36 boutons ?
    Est ce que l'appel à .grid servirait à récupérer la valeur de column ?
    Peut on créer des boutons avec une boucle For dans ce style :

    for i in range(n):
    self.nomDeBouton+n etc etc
    c'est une méthode qui marche très bien en action script, ça permet de créer
    nomDeBouton0, nomDeBouton1, nomDeBouton2 etc....

    il y a t il une méthode similaire en python ?
    j'ai abandonné action script depuis longtemps et je préfère python pour plein de raisons

    Je vais tout essayer
    je vais aussi de mettre en oeuvre une lambda avec command

    encore merci
    elafitz

  4. #4
    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
    Il y a beaucoup trop de sujets dans vos questions!
    Pour instancier 36 Button, il suffit d'appeler le constructeur dans une boucle "for".

    Après le sujet pourrait être comment stocker les références a ces instances dans une structure de donnée qui permette de... Si vous voulez un correspondance n ---> Button, le dict que vous utilisez est une solution.

    Si vous voulez polluer l'espace de nom de l'instance de MyApp avec des attributs de la forme 'nomDeBouton+n',
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setattr(self, 'nomDeBouton%d' %i, Button...)
    fera l'affaire.

    Ceci dit les Widgets sont hiérarchiques, pas être simple de s'y retrouver si vous mettez tout a plat dans MyApp!

    De plus, les widgets Tk peuvent être nommes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btn = tk.Button(name='nomDeBouton%d' % i,...)
    crée une entrée dans le dict .children du parent nommée 'nomDeBouton%d' (par défaut, ça utilise id())

    Le choix entre utiliser ce qui existe ou quelque chose de plus adapte a vos besoins passe par "savoir ce qui existe" et/ou exposer ses besoins pour voir comment "re-utiliser" plutôt que de réinventer.

    Je dis ça parce que le vrai sujet n'est pas d'avoir une collection de boutons mais de définir les opérations qu'on voudra/devra faire sur la collection ou ses éléments: si c'est juste pour les garder au chaud, tkinter fait deja cela pour vous.

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

  5. #5
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut
    ça marche ,

    j'ai opté pour :

    btn = tk.Button(name='nomDeBouton%d' % i,...) dans une boucle for
    je ne connaissais pas cette syntaxe ----> name='nomDeBouton%d' % i

    j'ai encore des lacunes, mais je travaille beaucoup, et avant de poser des questions sur les forums je cherche énormément,

    mon but n'est évidemment pas d'avoir une collection de boutons, je veux juste
    créer un clavier alphabétique pour des applications ayant un lien avec les mots, les lettres, pour un ami handicapé qui peut tout juste se servir d'une
    souris, c'est un petit cadeau que je lui fait, et votre intervention m'a été d'un grand secours,
    je bloquais sur cet aspect du code en voulant utiliser tkinter, mais tout le code de base est pleinement opérationnel en fenêtre dos
    j'étudie depuis peu tkinter que je trouve formidable!
    Merci encore pour votre intervention , j'ai beaucoup appris avec vous

  6. #6
    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
    Citation Envoyé par elafitz Voir le message
    je veux juste créer un clavier alphabétique pour des applications ayant un lien avec les mots, les lettres, pour un ami handicapé qui peut tout juste se servir d'une souris
    De base, un Button permet de lancer une command lorsqu'on clique dessus. Cette "command" est un callback qui ne sait pas quel Button a été clique. La solution dans ce cas sera de passer l'instance du Button en paramètre via un lamda:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    btn = tk.Button(....) # creation de l'instance, puis:
    btn['command'] = lambda btn=btn: do_click(btn)
    Et attention a la syntaxe c'est "btn=btn" qui fait marcher la chose surtout si vous vous proposer d'en créer 36 dans une boucle.

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

  7. #7
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut
    ce que j'ai fait fait après votre intervention c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.bt = tkinter.Button(self.fram4, name='bt%d' % i, ......, .......
                             ,command = lambda x=i:self.actionBouton(int(x)))
    et ça marche très bien, mais je vais tout de même essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    btn = tk.Button(....) # creation de l'instance, puis:
    btn['command'] = lambda btn=btn: do_click(btn)
    comme vous l'indiquez.
    C'est toujours bon d'apprendre !
    merci, encore.

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

    Ce que vous avez fait "fonctionne": le callback utilise l'entier passe en paramètre pour aller re-chercher le Button associe a l'entier. Mais cela implique que le callback sait comment s'en débrouiller.
    Ca coûte un mapping a définir et une dépendance entre le callback et le support de ce mapping.
    Passer directement l'instance du Button en paramètre est quand même plus simple.

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

  9. #9
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Par défaut
    je ne sais pas où est l'erreur, mais je dois mal écrire mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from tkinter import *
     
    fenp = Tk()
    def do_click():
        print(btn)
     
    btn = Button(fenp, text="OK").pack()
    btn['command'] = lambda btn=btn: do_click(btn)
     
    fenp.mainloop()
    le message d'erreur :

    Traceback (most recent call last):
    File "D:\WIN\PYTHON\TRAVAUX\travaux_1\MonAppli\doclick.py", line 8, in <module>
    btn['command'] = lambda btn=btn: do_click(btn)
    TypeError: 'NoneType' object does not support item assignment

  10. #10
    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
    même gag que la première fois: btn reçoit le retour de l'appel a /.pack/ et non l'instance qui a été crée.
    De plus, il va falloir vous habituer a lire l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: 'NoneType' object does not support item assignment
    L'assignation se fait sur /btn['command']/.
    Impossible d'appliquer a None la méthode __setitem__(btn, 'command', value)
    - 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.

Discussions similaires

  1. [JTextField] Récupérer le texte avec un bouton
    Par Chelz dans le forum Débuter
    Réponses: 3
    Dernier message: 04/10/2014, 19h48
  2. Récupérer le texte d'un entry quand on appuie sur un bouton
    Par drhouse87 dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 27/12/2011, 14h05
  3. Récupérer variable texte pour l'intégrer dans une image
    Par paradeeyes dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 18/10/2009, 18h01
  4. Récupérer un texte saisi dans un formulaire dans une variable
    Par cyberlp dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 02/07/2009, 10h52
  5. Récupérer variable dans input type text
    Par Enthau dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/06/2007, 08h53

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