2016-07-23 7 views
1

Ich habe eine gewisse OCD-Eigenschaft, bei der ich explizit angeben möchte, welche Argumente auf welche Werte gesetzt werden. Zum Beispiel gegeben, eine Funktion:Tkinter OptionMenu Argumente

def func(a, b): 
    return a+b 

Immer wenn ich auf der oben genannten Funktion aufrufen, in meinem Code, ich schreibe immer:

func(a=6, b=7) 

Statt:

func(6, 7) 

Das Problem I‘ M ist, dass ich das mit der OptionMenu-Klasse in Tkinter nicht tun kann. Das folgende Beispiel befindet sich in einer benutzerdefinierten Klasse

self.var = tk.StringVav() 
choices = ['op1', 'op2'] 
self.menu_m = tk.OptionMenu(master=self.frame_1, variable=self.var, *choices) 

Dies führt zu mehreren Werten für das Argument "Master". Wie kann ich den Master, die Variable und die Liste der zu verwendenden Optionen explizit definieren?

+0

Sie könnten ein Argument fehlt, 'value =‚op1'' –

+0

* 'StringVar()' –

+0

Es funktioniert nicht, wenn Sie auch versuchen, diese für 'variable':' Variable = self.var' löst 'TypeError' aus. Und der Hauptteil des Fehlers sagt: "__init __() hat mehrere Werte für das Argument 'variable'". –

Antwort

3

Leider ist das OptionMenu Widget etwas schlecht implementiert. Unabhängig von Ihren Einstellungen ist das Optionsmenü nicht dafür ausgelegt, Schlüsselwortargumente für die ersten drei Parameter master, variable und value zu akzeptieren. Sie müssen in dieser Reihenfolge als Positionsargumente angegeben werden.

self.menu_m = tk.OptionMenu(self.frame_1, self.var, *choices) 
+0

Warum hast du '.., Auswahlmöglichkeiten [0], * Auswahlmöglichkeiten' 'anstatt nur' ..., * Auswahlmöglichkeiten '' geschrieben? Es scheint so, als würde ersteres dazu führen, dass der erste Menüpunkt zweimal erscheint. – martineau

+2

@martineau: Ich war anscheinend verwirrt. Leider sind die tk und ttk OptionMenus subtil verschieden, und ich muss zu dem Zeitpunkt an das ttk Optionsmenü gedacht haben. Das 'ttk.OptionMenu' nimmt unmittelbar nach den Positionsargumenten ein zusätzliches Schlüsselwortargument namens' default'. Ich werde die Antwort reparieren. –