본문 바로가기
파이썬

파이썬 ttk 콤보 박스의 기본값 설정

by º기록 2020. 9. 28.
반응형

저는 Arch Linux x86_64에서 Python 3.2.1을 사용하고 있습니다. 이것은 정말 나를 미치게 만듭니다. 그리드를 그리 자마자 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()

물론 실제 프로그램에서는 함수를 사용해야하므로 다른 솔루션이 필요합니다.

 

해결 방법

 

문제는 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()

 

참조 페이지 https://stackoverflow.com/questions/6876518

 

 

반응형

댓글