Uebergabe undefinierter Anzahl von Argumenten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Hallo,

ich möchte mir Radiobuttons mit einer Funktion erzeugen lassen. Die Funktion als solche funktioniert auch zufriedenstellend.

Code: Alles auswählen

def radiobuttons(window_handler, entries=[], first_choice="", command_strings=[]):
    button_state=tkinter.StringVar()
    button_state.set(first_choice)
    #botton_state.set("")
    #button_state_list=[]
    for name, selection in entries:
        print (name)
        radiobutton=tkinter.Radiobutton(
            window_handler,
            text=name,
            value=selection,
            variable=button_state,
            command_strings
        )
        radiobutton.pack()
        #button_state_list.append(button_state)
    return button_state
Jetzt kann ich den Radiobuttons eine manigfaltige Auswahl an Zusatzbefehlen mitsenden, es sind aber nicht alle notwendig - z.B. Fordergrundfarbe, Hintergrundfarte ... - nur einige sind wichtig, wie der Variablenname, der Bezeichner (text=...).

Ich möchte also in die Funktionsklammer von tkinter.radiobutton(...) einen Platzhalter für eine undefiniert lange Zusatzkommandos mit übergeben. Ich habe dazu diese Seite gelesen http://www.python-kurs.eu/parameter.php und dann unter Abschnitt "beliebige Schlüsselwortparameter" geschaut. Dort wurden zwei Sternchen drangesetzt (**). Das hab ich auch so probiert beim Definieren der Funktion

Code: Alles auswählen

[Code=python file=Untitled.py]def radiobuttons(window_handler, entries=[], first_choice="", **command_strings=[]):
Aber ebenso kommt wie bei der ganzen geposteten Funktion von mir eine Fehlermeldung "non-keyword arg after keyword arg".

Ich würde gerne lernen, wie man das Lösen kann. Kann mir jemand von Euch bitte helfen?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Probier das mal:

Code: Alles auswählen

    def radiobuttons(window_handler, entries=[], first_choice="", **command_strings):
        button_state=tkinter.StringVar()
        button_state.set(first_choice)
        #botton_state.set("")
        #button_state_list=[]
        for name, selection in entries:
            print (name)
            radiobutton=tkinter.Radiobutton(
                window_handler,
                text=name,
                value=selection,
                variable=button_state,
                **command_strings
            )
            radiobutton.pack()
            #button_state_list.append(button_state)
        return button_state
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Papp Nase: Das kann man doch leicht selbst herausfinden. Ausgaben aus der IPython-Shell:

Code: Alles auswählen

In [1]: def test_args(*args):
   ...:     return args
   ...: 

In [2]: test_args('foo', True, 0)
Out[2]: ('foo', True, 0)

In [3]: def test_kwargs(**kwargs):
   ...:     return kwargs
   ...: 

In [4]: test_kwargs(foo=True, bar=3, baz=None)
Out[4]: {'bar': 3, 'baz': None, 'foo': True}
Die Variante mit 1 Sternchen gibt offenbar ein Tupel mit den variablen Argumenten zurück. Die Variante mit 2 Sterchen gibt ein Wörterbuch zurück und erwartet Keyword-Argumente. Beide Rückgaben sind normale Python-Typen und können innerhalb deiner Funktion abgefragt werden.

Was nicht geht, ist das Setzen von Standardwerten. Du kannst aber Standardwerte in einem Wörterbuch definieren und dann mittels ``deine_werte.update(kwargs)`` diese Werte mit den vom Aufrufer der Funktion angegebenen Werten überschreiben lassen. Was der Aufrufer nicht angegeben hat, bleibt dann halt als Standardwert gesetzt.

EDIT: Wenn du aber ohnehin diese ``command_args`` gesondert angeben willst und die Standardwerte letztlich eine Sache von TKinter sind, dann kannst du den Anwender genau so gut direkt ein Wörterbuch für mögliche Modifikationen des Radiobuttons angeben lassen. In die Doku der Funktion schreibst du dann halt, dass die ``command_args`` so wie sie sind weitergereicht werden.
Antworten