[Python / Tkinter] Comment passer des arguments à la commande

Que présenter cette fois

Des options telles que le widget Button dans Tkinter: je vais vous montrer comment passer des arguments à communad.

Exemple de code (exemple de réussite)

import tkinter as tk
import tkinter.ttk as ttk

class Application(ttk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.master.title("Title")
        self.master.geometry("400x300")
        self.create_widgets()
    
    def create_widgets(self):
        for i in range(1, 11):
            ttk.Button(self, text=f"bouton{i}", command=self.show_message(i)).pack()
    
    def show_message(self, index):
        def inner():
            print(f"bouton{index}A été cliqué")
        return inner

def main():
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

if __name__ == "__main__":
    main()

Erreurs courantes et solutions

Pourquoi ça échoue

Quand j'essaye de l'écrire normalement, j'ai tendance à l'écrire comme suit:


import tkinter as tk
import tkinter.ttk as ttk

class Application(ttk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.master.title("Title")
        self.master.geometry("400x300")
        self.create_widgets()
    
    def create_widgets(self):
        for i in range(1, 11):
            ttk.Button(self, text=f"bouton{i}", command=self.show_message(i)).pack()
    
    def show_message(self, index):
        print(f"bouton{index}A été cliqué")

def main():
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

if __name__ == "__main__":
    main()

Malheureusement, cela ne fonctionne pas comme prévu.

Comme vous pouvez le voir en le déplaçant, self.show_message (i) est exécuté lorsque le bouton est généré, et tous les boutons {index} sont cliqués sont imprimés. Et lorsque le bouton important est cliqué, aucune action n'est entreprise. Ceci est lié au comportement de l'option de commande comme suit.

Solution

En raison des spécifications gênantes décrites ci-dessus, une certaine ingéniosité est requise lors de la définition de la fonction de rappel. La partie nécessaire du code (dans ce cas, print (f" bouton {index} a été cliqué ")) n'est pas exécutée par self.show_message (i), et self n'est pas exécuté. Vous devez l'exécuter avec .show_message (i) () .

Pour ce faire, utilisez ** Inner Function **. C'est facile à comprendre si vous pensez que c'est comme suit.


def show_message(index):
    def inner():
        print(f"bouton{index}A été cliqué")
    return inner

command = show_message(1)
command()

La fonction interne (fonction interne) est définie dans la fonction show_message et elle est renvoyée. En d'autres termes, la fonction interne est incluse dans la «commande» sur la deuxième ligne à partir du bas. Cependant, comme le contenu de la fonction interne n'a pas été exécuté, il ne sera pas imprimé. Et sur la dernière ligne, nous exécutons la fonction interne.

En d'autres termes, show_message (1) ne semble rien faire, mais show_message (1) () vous permet de faire ce que vous voulez.

référence

--python tkinter Comment déterminer quel bouton a été enfoncé --memopy http://memopy.hatenadiary.jp/entry/2017/06/11/220452 --Lors du passage d'arguments avec l'option de commande de Tkinter, cela fonctionne comme prévu pour définir l'imbrication dans la fonction https://qiita.com/yukid/items/a0140b5c1a3e28f636f0

Recommended Posts

[Python / Tkinter] Comment passer des arguments à la commande
Comment recevoir des arguments de ligne de commande en Python
Comprenons comment passer des arguments (édition Python)
Comment mettre à jour Tkinter de Python vers la version 8.6
Exécuter la fonction Python à partir de Powershell (comment passer des arguments)
[python] Comment utiliser __command__, explication des fonctions
Comment passer des arguments à un script Python dans SPSS Modeler Batch
Comment passer des arguments en utilisant une instance avec la commande systemctl de systemd
Comment installer Python
Comment installer python
[Python] Comment tester l'analyseur de ligne de commande cliquez sur
Comment utiliser tkinter avec python dans pyenv
[Introduction à Udemy Python3 + Application] 67. Arguments de ligne de commande
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
[2020.8 dernière] Comment installer Python
[Pour les débutants] Comment utiliser la commande say avec python!
Comment installer Python [Windows]
python3: Comment utiliser la bouteille (2)
[Python] Comment utiliser la liste 1
Python: comment utiliser pydub
[Python] Comment utiliser checkio
Comment exécuter Notepad ++ Python
Comment gérer les arguments lors de l'implémentation d'un script Python en tant qu'outil de ligne de commande
Comment changer la version de Python
Comment développer en Python
Comment exécuter une commande à l'aide d'un sous-processus en Python
[python] Comment juger scalaire
[Python] Comment utiliser input ()
Comment réécrire l'étiquette Tkinter
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser les octets Python
Comment exécuter un fichier Python à une invite de commande Windows 10
Comment spécifier des arguments de ligne de commande lors du débogage avec PyCharm
[Python] Comment FFT des données mp3
[Python] Comment faire PCA avec Python
Python: comment utiliser async avec
[Python] Comment dériver nCk (ABC156-D)
[Python] Comment utiliser la série Pandas
Comment collecter des images en Python
[Introduction à Python] Comment analyser JSON
Dans la commande python, python pointe vers python3.8
Comment utiliser MBDyn (paramètre de commande)
Comment obtenir la version Python
Comment démarrer avec Python
Comment utiliser Mysql avec python
Comment utiliser l'API Python d'OpenPose
[Python] Comment permuter les valeurs de tableau
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Python: Comment utiliser pydub (lecture)
Comment utiliser PubChem avec Python
Comment accélérer les calculs Python
Transmettez des arguments à Task dans discord.py
Comment calculer la date avec python