Установите значение по умолчанию для ttk Combobox - PullRequest
8 голосов
/ 29 июля 2011

Я использую Python 3.2.1 в Arch Linux x86_64. Это действительно сводит меня с ума: я просто хочу иметь предварительно выбранное значение по умолчанию для ttk.Combobox, как только я его настроу. Это мой код:

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()

, который рисует пустой Combobox. Что смешно, если я не использую функцию, она отлично работает:

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()

Конечно, в реальной программе мне нужно использовать функцию, поэтому мне нужно другое решение.

Ответы [ 3 ]

26 голосов
/ 29 июля 2011

Проблема в том, что экземпляр StringVar получает сборщик мусора.Это потому, что это локальная переменная из-за того, как вы написали свой код.

Одним из решений является использование класса, чтобы ваш StringVar сохранялся:

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()
4 голосов
/ 30 июля 2011

Когда ваша функция 'combo' выходит, локальная переменная 'value' уничтожается. Вам нужна постоянная переменная, такая как глобальная переменная или переменная, которая является свойством класса, чтобы значение не собиралось мусором, пока виджет еще существует.

0 голосов
/ 01 октября 2017

Метод get() можно использовать в вашей функции, чтобы переименовать StringVar и сохранить его под другим именем, чтобы избежать его полной потери при сборке мусора.

value = StringVar()

keepvalue = value.get()

, затем используйте keepvalue вместо значения:

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

Это показало 'A' в выпадающем списке для меня.

...