2013-10-02 14 views
9

Un widget di opzione ttk inizia con tutti i suoi valori nel menu a discesa. Selezionando qualsiasi valore, il primo valore nell'elenco scompare, mai per riapparire ...opzione tkinter opzione first svanisce

Qualcuno sa perché? Questa è una caratteristica del design del widget? Provalo con il seguente:

import tkinter.ttk as ttk 
import tkinter as tk 

a = tk.Tk() 

options = ['1', '2', '3'] 
value = tk.StringVar() 

masterframe = ttk.Frame() 
masterframe.pack() 

dropdown = ttk.OptionMenu(masterframe, value, *options) 
dropdown.pack() 

a.mainloop() 

Nota - un altro utente ha chiesto la stessa domanda qui: OptionMenu won't show the first option when clicked (Tkinter)

Sembrano to've trovato una soluzione, ma non capito perché stava accadendo.

UPDATE: in realtà questo comportamento appare solo quando si utilizza il widget ttk. Il widget tk funziona bene (anche se sembra molto brutto).

risposta

1

Sembra che con ttk.OptionMenu la prima voce nella lista delle opzioni deve essere lasciato vuoto:

import tkinter.ttk as ttk 
import tkinter as tk 

a = tk.Tk() 

options = ['', '1', '2', '3'] 
value = tk.StringVar() 
value.set(options[1]) 

masterframe = ttk.Frame() 
masterframe.pack() 

dropdown = ttk.OptionMenu(masterframe, value, *options) 
dropdown.pack() 

a.mainloop() 

Fonte: http://www.pyinmyeye.com/2012/08/tkinter-menubutton-demo.html

+0

Questo collegamento sembra essere morto. –

+2

Mentre la tua soluzione funziona, non è una descrizione molto buona del problema. 'ttk.OptionMenu' si aspetta un valore predefinito dopo l'argomento della variabile e prima dell'elenco di valori. Mentre la soluzione funziona, oscura ciò che sta realmente accadendo. –

19

La firma del comando ttk.OptionMenu è questo:

def __init__(self, master, variable, default=None, *values, **kwargs): 

Questa è la docstring:

"" "Costruisci un widget OptionMenu a tema con master come genitore, la variabile di testo risorsa impostata su variabile, il valore inizialmente selezionato specificato dal parametro predefinito, i valori di menu dati da * valori e parole chiave aggiuntive.

Avviso l'opzione default che precede l'elenco di valori. Invece di aggiungere un elemento vuoto all'elenco di valori, aggiungi il valore che desideri come predefinito:

options = ['1', '2', '3'] 
dropdown = ttk.OptionMenu(masterframe, value, options[1], *options) 
+5

haha, fantastico, hai aggiunto una buona risposta a una domanda di 1 anno esattamente 4 ore prima che ne avessi bisogno. – Gregor