2011-07-29 3 views
8

저는 아치 리눅스 x86_64에서 파이썬 3.2.1을 사용하고 있습니다. 이것은 실제로 나를 미치게 만듭니다. 나는 그리드하자 마자 ttk.Combobox에 대한 기본값 인 사전 선택된 값을 갖고 싶습니다. 빈 Combobox립니다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() 

: 이것은 내 코드입니다. 나는이 기능을 사용할 필요가 실제 프로그램에서, 물론

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

, 그래서 다른 솔루션이 필요합니다 : 어떤 재미있는 것은 내가 함수를 사용하지 않는 경우가 완벽하게 작동한다는 것입니다.

답변

23

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

감사합니다. 완벽하게 작동합니다. 사실 내 애플 리케이션에서 클래스를 사용하고 있었지만,'box_value'에 지역 변수를 사용하고있었습니다. 'self.box_value'는 트릭입니다;) – kynikos

+0

불편을 끼쳐 드려 죄송하지만, ttk를 가져올 때 "Combobox"를 옵션이나 위젯으로 인식하지 못합니다. 어떤 아이디어? – texasman1979

+0

@ texasman1979, 어떤 버전의 파이썬을 사용하고 있습니까? 그리고 어떤 OS가 있습니까? 'ttk .__ file__'을 확인하여 올바른'ttk' 모듈인지 확인하십시오. – eryksun

4

함수 '콤보'종료, 로컬 변수 '값은'파괴 된 경우 :

하나의 솔루션은 StringVar가 지속되도록 클래스를 사용하는 것입니다. 전역 변수 나 클래스의 속성 인 변수와 같은 영구 변수가 있어야 위젯이 여전히 존재하는 동안 값이 가비지 수집되지 않습니다.

+0

기술 설명 주셔서 감사합니다 ^^ – kynikos

0

getVer() 메서드는 함수 내에서 StringVar의 이름을 바꾸고 다른 이름으로 저장하여 가비지 수집을 통해 손실되지 않도록 할 수 있습니다.

StringVar 값 =()

keepvalue value.get =()

다음 값 대신 'keepvalue'사용 = ttk.Combobox (루트하면 textVariable = keepvalue 상태

상자 = 'readonly')

이것은 나를 위해 콤보 박스에 'A'가 표시되었습니다.