Establecer un valor predeterminado para un ttk Combobox

Estoy usando Python 3.2.1 en Arch Linux x86_64. Esto realmente me está volviendo loco: solo quiero tener un valor predeterminado, preseleccionado para un ttk.Combobox tan pronto como lo ttk.Combobox . Este es mi código:

 from tkinter import Tk, StringVar, ttk root = Tk() def combo(parent): value = StringVar() box = ttk.Combobox(parent, textvariable=value, state='readonly') box['values'] = ('A', 'B', 'C') box.current(0) box.grid(column=0, row=0) combo(root) root.mainloop() 

Lo que dibuja un Combobox vacío. Lo que es divertido es que si no uso una función funciona perfectamente:

 from tkinter import Tk, StringVar, ttk root = Tk() value = StringVar() box = ttk.Combobox(root, textvariable=value, state='readonly') box['values'] = ('A', 'B', 'C') box.current(0) box.grid(column=0, row=0) root.mainloop() 

Por supuesto, en el progtwig real tengo que usar una función, así que necesito otra solución.

El problema es que la instancia de StringVar se está recolectando en la basura. Esto se debe a que es una variable local debido a cómo escribió su código.

Una solución es usar una clase para que su StringVar persista:

 from tkinter import Tk, StringVar, ttk class Application: def __init__(self, parent): self.parent = parent self.combo() def combo(self): self.box_value = StringVar() self.box = ttk.Combobox(self.parent, textvariable=self.box_value, state='readonly') self.box['values'] = ('A', 'B', 'C') self.box.current(0) self.box.grid(column=0, row=0) if __name__ == '__main__': root = Tk() app = Application(root) root.mainloop() 

Cuando su función ‘combo’ sale, la variable local ‘valor’ se destruye. Necesita una variable persistente, como una variable global o una variable que sea propiedad de una clase para que el valor no se recoja mientras el widget aún existe.

El método get() se puede usar dentro de su función para cambiar el nombre de StringVar y guardarlo con otro nombre para evitar perderlo por completo a través de la recolección de basura.

 value = StringVar() keepvalue = value.get() 

luego use keepvalue lugar de value:

 box = ttk.Combobox(root, textvariable=keepvalue, state='readonly') 

Esto tenía ‘A’ mostrando en el combobox para mí.