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 :

Passage d'arguments avec partial


Sujet :

Tkinter Python

  1. #1
    Membre actif
    Passage d'arguments avec partial
    Bonjour,
    Je m'interroge sur la possibilité d'utiliser Partial() afin de passer des arguments nommés dans widget.after(). (Veuillez noter que ma question ne porte que sur l'utilisation de Partial() ...)
    Sa mise en oeuvre avec tk.Button ne pose aucun problème:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from functools import partial
    import tkinter as tk
     
    root = tk.Tk()
    def action(arg1, arg2=None):
        print(f"arg1 = {arg1}, arg2 = {arg2}")
    b = tk.Button(root, text="ok", command= partial(action,arg2=100, arg1=200))
    b.grid()
    root.mainloop()

    Par contre, utilisé avec la méthode after comme ci dessous:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from functools import partial
    import tkinter as tk
     
    root = tk.Tk()
    def action(arg1, arg2=None):
        print(f"arg1 = {arg1}, arg2 = {arg2}")
    root.after(1000,partial(action,arg2=100, arg1=200))
    root.mainloop()


    Le code renvoit l'exception :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Traceback (most recent call last):
      File "/home/fab/bidon1.py", line 10, in <module>
        root.after(1000,partial(action,arg2=100, arg1=200))
      File "/usr/lib/python3.6/tkinter/__init__.py", line 755, in after
        callit.__name__ = func.__name__
    AttributeError: 'functools.partial' object has no attribute '__name__'
    >>>

    Qu'en est il?

  2. #2
    Expert éminent sénior
    Salut,

    Citation Envoyé par Hominidé Voir le message
    Qu'en est il?
    Techniquement, çà dit juste que l'objet fabriqué avec partial n'a pas l'attribut __name__ sur lesquel .after s'appuie pour construire sa closure et le relier à TK.
    Comme c'est documenté, il faut mouliner l'objet retourné par partial avec functools.update_wrapper...

    Après vous pouvez aller râler auprès des développeurs Python pour que la construction de la closure qu'ils font dans ce code utilise une autre technique que celle qu'ils ont choisi (et là, leur proposer quelque chose sera un plus).

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

  3. #3
    Membre actif
    Citation Envoyé par wiztricks Voir le message
    Techniquement, çà dit juste que l'objet fabriqué avec partial n'a pas l'attribut __name__ sur lesquel .after s'appuie pour construire sa closure et le relier à TK.
    Comme c'est documenté, il faut mouliner l'objet retourné par partial avec functools.update_wrapper...
    Merci...
    Citation Envoyé par wiztricks Voir le message

    Après vous pouvez aller râler auprès des développeurs Python
    Râler, certainement pas. Un grand merci plutôt

###raw>template_hook.ano_emploi###