2013-05-13 7 views
5

Ho aggiunto un widget OptionMenu al mio codice e assegnato un elenco come opzioni. Ecco com'è:OptionMenu non mostrerà la prima opzione quando si fa clic (Tkinter)

z = StringVar() 
z.set(userList[0])  
usersOption = OptionMenu(frame1, z, *userList)#, command=changeUser) 
usersOption.pack(side=RIGHT, padx=3) 

Ora, penso che mostrerebbe tutte le opzioni in tale elenco. Come così:

Option 1 \/ <-- the box with the selected option 
Option 1 }\__the options that show on click 
Option 2 }/ 

ma in realtà mostra solo la seconda opzione, e quando scelgo essa v'è, in fondo, senza via di ritorno, se scatto la casella di nuovo si continua mostrando solo l'opzione 2 e non posso cambiarlo anche con i tasti su e giù. Ho provato a cercare soluzioni, ma non ho ottenuto nulla, quindi sto iniziando a pensare che sia il modo operativo predefinito del widget, ma non ho trovato nulla che mi mostrasse come risolverlo nella documentazione che ho letto.
P.S .: Sto usando Python 3.3

+0

è 'z' un'istanza di un Tkinter' StringVar'? Sei assolutamente sicuro che 'userlist' ha il valore che pensi che abbia? –

+0

sì, lo è e sì, lo fa. L'elenco viene creato dalle righe di un file txt senza gli interruttori di linea '\ n' (per questo uso .strip()). Questo file di testo ha attualmente due righe: "Utente 1" e "Utente 2". Ed è impostato su userList [0]. (Modificherò il testo per aggiungerlo) – AugustoQ

risposta

1

Non importa, ho tolto lo *userList e ho usato un ciclo for per inserire gli elementi come comandi. Ora funziona bene.
Il codice che ho usato:

for user in userList: 
    usersOption["menu"].insert("end", "command", label=user, command=_setit(z, user, changeUser)) 
6

Ho avuto lo stesso problema e mi stava facendo impazzire, così ho guardato nel source. Penso che il problema è che il terzo argomento del costruttore è il valore predefinito. Se non lo specifichi prima di * userList, sembra che prenda il primo elemento come valore predefinito. Una vera e propria correzione sarebbe qualcosa di simile:

z = StringVar() 
z.set(userList[0])  
usersOption = OptionMenu(frame1, z, userList[0] ,*userList)#, command=changeUser) 
usersOption.pack(side=RIGHT, padx=3) 
+0

Sì. Come risposta in [questa domanda] (https://stackoverflow.com/questions/19138534/tkinter-optionmenu-first-option-vanishes) – Kalissar

3

risposta in ritardo ..

Basta usare

self.option = OptionMenu(PARENT, VALUE TO BE CHANGED, "DEFAULT TEXT", *OPTIONS_ARRAY/LIST) 

funziona perfettamente per me.

Problemi correlati