[Python / Tkinter] Übergeben von Argumenten an den Befehl

Was diesmal einzuführen

Optionen wie das Button-Widget in Tkinter: Ich werde Ihnen zeigen, wie Sie Argumente an communad übergeben.

Beispielcode (Erfolgsbeispiel)

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"Taste{i}", command=self.show_message(i)).pack()
    
    def show_message(self, index):
        def inner():
            print(f"Taste{index}Wurde angeklickt")
        return inner

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

if __name__ == "__main__":
    main()

Häufige Fehler und Lösungen

Warum es fehlschlägt

Wenn ich versuche, es normal zu schreiben, neige ich dazu, es wie folgt zu schreiben:


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"Taste{i}", command=self.show_message(i)).pack()
    
    def show_message(self, index):
        print(f"Taste{index}Wurde angeklickt")

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

if __name__ == "__main__":
    main()

Leider funktioniert dies nicht wie erwartet.

Wie Sie durch Verschieben sehen können, wird "self.show_message (i)" ausgeführt, wenn die Schaltfläche generiert wird, und alle "Schaltflächen {Index} werden angeklickt" werden gedruckt. Wenn Sie auf die wichtige Schaltfläche klicken, wird keine Aktion ausgeführt. Dies hängt wie folgt mit dem Verhalten der Befehlsoption zusammen.

Lösung

Aufgrund der oben beschriebenen problematischen Spezifikationen ist bei der Definition der Rückruffunktion ein gewisser Einfallsreichtum erforderlich. Der erforderliche Teil des Codes (in diesem Fall "print (f" button {index} wurde angeklickt ")") wird von "self.show_message (i)" nicht ausgeführt, und "self" wird nicht ausgeführt. Sie müssen es mit .show_message (i) () `ausführen.

Verwenden Sie dazu ** Innere Funktion **. Es ist leicht zu verstehen, wenn Sie denken, dass es wie folgt ist.


def show_message(index):
    def inner():
        print(f"Taste{index}Wurde angeklickt")
    return inner

command = show_message(1)
command()

Die innere Funktion (interne Funktion) wird in der Funktion show_message definiert und zurückgegeben. Mit anderen Worten, die innere Funktion ist im Befehl in der zweiten Zeile von unten enthalten. Da der Inhalt der inneren Funktion jedoch nicht ausgeführt wurde, wird er nicht gedruckt. Und in der letzten Zeile wird die innere Funktion ausgeführt.

Mit anderen Worten, "show_message (1)" scheint nichts zu tun, aber "show_message (1) ()" ermöglicht es Ihnen, das zu tun, was Sie wollen.

Referenz

--python tkinter So bestimmen Sie, welche Taste gedrückt wurde --memopy http://memopy.hatenadiary.jp/entry/2017/06/11/220452

Recommended Posts

[Python / Tkinter] Übergeben von Argumenten an den Befehl
So empfangen Sie Befehlszeilenargumente in Python
Lassen Sie uns verstehen, wie Argumente übergeben werden (Python Edition)
So aktualisieren Sie Pythons Tkinter auf 8.6
Führen Sie die Python-Funktion von Powershell aus (wie Sie Argumente übergeben).
[Python] Verwendung von __command__, Funktionserklärung
Übergeben von Argumenten an Python-Skripte in SPSS Modeler Batch
Übergeben von Argumenten mithilfe einer Instanz mit dem systemctl-Befehl von systemd
So installieren Sie Python
So installieren Sie Python
[Python] So testen Sie den Befehlszeilen-Parser-Klick
Wie man tkinter mit Python in Pyenv benutzt
[Einführung in Udemy Python3 + Application] 67. Befehlszeilenargumente
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
[Neueste Version 2020.8] So installieren Sie Python
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
So installieren Sie Python [Windows]
python3: Verwendung der Flasche (2)
[Python] Verwendung von Liste 1
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
So führen Sie Notepad ++ Python aus
Verwalten von Argumenten beim Implementieren eines Python-Skripts als Befehlszeilentool
So ändern Sie die Python-Version
Wie man in Python entwickelt
So führen Sie einen Befehl mit einem Unterprozess in Python aus
[Python] Wie man Skalar beurteilt
[Python] Verwendung von input ()
So schreiben Sie das Tkinter-Etikett neu
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Verwendung von Python-Bytes
So führen Sie eine Python-Datei an einer Windows 10-Eingabeaufforderung aus
So geben Sie Befehlszeilenargumente beim Debuggen mit PyCharm an
[Python] Wie man MP3-Daten fFT
[Python] Wie man PCA mit Python macht
Python: So verwenden Sie Async mit
[Python] Wie man nCk ableitet (ABC156-D)
[Python] Verwendung der Pandas-Serie
So sammeln Sie Bilder in Python
[Einführung in Python] So analysieren Sie JSON
Im Python-Befehl zeigt Python auf Python3.8
Verwendung von MBDyn (Befehlseinstellung)
So erhalten Sie die Python-Version
Erste Schritte mit Python
Wie man MySQL mit Python benutzt
Verwendung der Python-API von OpenPose
[Python] So tauschen Sie Array-Werte aus
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Python: Verwendung von pydub (Wiedergabe)
Verwendung von PubChem mit Python
So beschleunigen Sie Python-Berechnungen
Übergeben Sie Argumente in discord.py an Task
So berechnen Sie das Datum mit Python