Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tkinter: "command"

    17 décembre 2015 à 19:03:56

    Bonjour, j'essaie de faire une petite application qui va prendre le texte de labels, aller à l'url donnée et intégrer l'id dans la bonne case. J'utilise l'op "Entry" pour donner l'URL et l'ID. Pour que l'appli prenne les infos des labels, j'utilise un bouton qui va prendre ce qu'on écrit dans les "Entry" et le copier dans les labels. Sauf que je n'arrive pas à les copier...

    Je suis en  python 2.5

    voici le code (qui n'est qu'au début...):

    from Tkinter import*
    from urllib2 import*
    
    window=Tk()
    window.title("TEST")
    
    picture=Frame(window)
    picture2=Frame(picture)
    picture3=Frame(picture)
    
    value=StringVar()
    value.set("Entrez l'URL!")
    url=Entry(picture, textvariable=value, width=50).pack(side=TOP) #ENTRY
    
    value2=StringVar()
    value2.set("Entrez votre identifiant!")
    target=Entry(picture, textvariable=value2, width=50).pack(side=TOP) #ENTRY
    
    info_1=Label(picture2, text="URL: ").pack(side=LEFT) #LABEL
    
    conf_info_1=Label(picture2, text="").pack(side=LEFT) #LABEL
    
    info_2=Label(picture2, text="Id: ").pack(side=LEFT) #LABEL
    
    conf_info_2=Label(picture2, text="").pack(side=RIGHT) #LABEL
    
    conf_info=Button(picture, text="confirmer", fg="red", command=conf_info_1.config(text=value) and conf_info_2.config(text=value2)).pack(side=RIGHT) #BOUTON
    
    send=Button(picture, text="Go!", fg="red", command=window.quit).pack(side=RIGHT) #BOUTON #pour l'instant, je met window.quit mais après, ce sera l'ouverture de la page web avec l'id dedans 
    
    picture.pack() #FRAME
    picture2.pack(side=LEFT) #FRAME
    picture3.pack(side=RIGHT) #FRAME
    
    window.mainloop()


    De toute façon, ici, je prend seulement ce qu'il y a d'écrit de base non? Mais j'ai une erreur: "AttributeError: 'NoneType' object has no attribute 'config'"

    Ensuite, j'ai essayé ceci:

    conf_info=Button(picture, text="confirmer", fg="red", command=conf_info_1.config(text=url(textvariable)) and conf_info_2.config(text=target(textvariable))).pack(side=RIGHT) #BOUTON


    Et là, c'est pareil...

    une âme charitable? ^^

    merci d'avance ;)

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 décembre 2015 à 20:56:16

      http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter
      • Partager sur Facebook
      • Partager sur Twitter
        17 décembre 2015 à 21:36:21

        oui, il est dit qu'il faut faire l'action et l'argument, je sais mais je ne connais pas l'action et l'argument pour changer le texte d'un label par le texte qu'on tappe dans un "Entry"... ^^
        • Partager sur Facebook
        • Partager sur Twitter
          17 décembre 2015 à 22:02:02

          Ton problème c'est qu'il ne faut pas utiliser directement les méthodes de placement sur des objets qu'on va "variabiliser":

          #OUI (sans mettre dans une variable)
          Label(picture2, text="").pack(side=LEFT)
          
          #OUI (en 2 étapes si dans une variable)
          conf_info_1=Label(picture2, text="")
          conf_info_1.pack(side=LEFT)
          
          #NON
          conf_info_1=Label(picture2, text="").pack(side=LEFT)
          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien
            17 décembre 2015 à 22:22:47

            merci ;)

            mais maintenant, avec la première version donnée, au label "conf_info_1", il est directement marqué PY_VAR0 et rien pour "conf_info_2" sans même appuyer sur confirmer et lorsqu'on appuie sur confirmer, il ne se passe rien.

            avec la 2ème démarche, il y a une exception: "NameError: name 'textvariable' is not defined"

            • Partager sur Facebook
            • Partager sur Twitter
              18 décembre 2015 à 0:21:22

              Normal car tu fais:

              conf_info_1.config(text=value)


              Alors que value est une variable tkinter, et donc pour récupérer sa valeur il faut utiliser la méthode get:

              conf_info_1.config(text=value.get())


              Pour le reste, je pense que tu as un problème de conception. La façon dont tu as mis les infos dans command n'est pas bonne. Ce paramètre attend un callback. Regarde le lien donné par oldP pour comprendre ce que tu dois écrire.

              • Partager sur Facebook
              • Partager sur Twitter
              Précepte: Le mieux est l'ennemi du bien
                18 décembre 2015 à 8:46:13

                Olygrim a écrit:

                Normal car tu fais:

                conf_info_1.config(text=value)


                Alors que value est une variable tkinter, et donc pour récupérer sa valeur il faut utiliser la méthode get:

                conf_info_1.config(text=value.get())

                oki, ça ça me donne ce que je pensais avoir mais j'avais pas mis .get()...^^

                Olygrim a écrit:

                Pour le reste, je pense que tu as un problème de conception. La façon dont tu as mis les infos dans command n'est pas bonne. Ce paramètre attend un callback. Regarde le lien donné par oldP pour comprendre ce que tu dois écrire.

                là, je ne comprend pas trop... qu'entends-tu par un callback?

                oui, le lien dit qu'il faut faire:

                x=Button(parent, text=TexteEnQuoteOuUtilisationDeVariable, command=action(arguments)

                mais j'ai beau chercher, je ne trouve pas l'action avec l'argument qu'il faut pour ce que je veux faire...


                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  18 décembre 2015 à 10:06:31

                  def f():
                      conf_info_1['text'] = value.get()
                  
                  conf_info=Button(picture, text="confirmer", fg="red", command=f)
                  conf_info.pack()
                  

                  Pourquoi tu t'embêtes, ça doit fonctionner ça, évidemment tu modifies ta fonction f en fonction de tes besoins, j'ai fais au plus court

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 décembre 2015 à 10:08:31

                    Pour faire simple, un callback c'est le nom de la fonction:

                    def mon_affichage():
                        for i in range(10):
                            print(i)


                    Dans cet exemple, le callback est mon_affichage (sans les parenthèses). En fait c'est quand tu appuies sur le bouton que les parenthèses sont ajoutées (et donc que la fonction est exécutée). De manière plus générale, chaque objet auquel tu peux ajouter une paires de parenthèses est un callback: print, min, max, list.sort, Button, Tk, ......

                    Dans ton code, tu mets les parenthèses dès le départ, donc ta fonction est exécutée immédiatement à la création du bouton (et renverra une erreur lorsque tu cliquera dessus car .... ce que renvoie ta fonction n'est pas un callback ;)). Et tu est obligé de mettre les parenthèses car tes fonctions ont besoin darguments. Donc l'une des solution est d'utiliser une lambda (et c'est la question qui est posée dans le lien), qui est également une fonction (mais un peu spéciale), et de mettre ton code à l'intérieur de celle-ci. Un exemple de lambda:

                    #Fonction "classique"
                    def f1(n):
                        return n**2
                    
                    #Équivalence en lambda
                    f2 = lambda n: n**2
                    
                    
                    #Et l'utilisation est la même
                    f1(10)
                    f2(10)


                    Donc avec ses infos et en regardant de nouveau le lien (ce qui est intéressant dans celui-ci ce sont les réponses et non la question ;)) essaie de corriger ton programme. Si tu n'y arrives vraiment pas, je te filerai la réponse :'(

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                      18 décembre 2015 à 16:13:40

                      d'accord, merci ;)

                      donc, j'ai fait un callback, le voici:

                      def saisie1():
                      	return url.get()
                      	
                      def saisie2():
                      	return target.get()
                      
                      def ChangeTextLabel():
                      	conf_info_1.config(text=saisie1())
                      	conf_info_2.config(text=saisie2())

                      et j'ai donc assigné à la commande du bouton:

                      ChangeTextLabel()

                       ça ne m'a affiché le texte de départ entré dans url et target mais il ne change pas après opération...

                      j'ai aussi essayé comme cela:

                      def ChangeTextLabel():
                      	conf_info_1["text"]=value.get()
                      	conf_info_2["text"]=value2.get()
                      #sans les autres fcts

                      et c'est pareil...

                      qu'est-ce qui "merde"? ;)

                      je ne connais pas du tout lambda donc je vais chercher de ce côter :p

                      (surtout pas me donner la réponse tout de suite ;) "mieux vaut apprendre à un mendiant à pêcher que de lui donner directement et seulement un poisson" :D)



                      -
                      Edité par Varan1 18 décembre 2015 à 16:55:04

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        18 décembre 2015 à 18:30:37

                        j'ai aussi essayé comme cela:

                        Je ne vois pas la ligne déclarant la variable conf_info

                        -
                        Edité par Anonyme 18 décembre 2015 à 18:31:11

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 décembre 2015 à 14:00:18

                          désolé, je n'ai pas eu le temps de retourner sur mon pc... je reprends l'affaire.

                          conf_info=Button(picture, text="confirmer", fg="red", command=ChangeTextLabel())
                          conf_info.pack(side=RIGHT) #BOUTON

                          voilà

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            24 décembre 2015 à 18:05:26

                            Enlève les parenthèses après ChangeTextLabel, ça supprimera déjà une erreur...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 décembre 2015 à 19:45:37

                              Grands mercis à tous, ça fonctionne enfin ;)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Tkinter: "command"

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown