2012-10-04 6 views
1

저는 파이썬에서 초보자이며 TkInter를 사용하여 GUI를 만들려고합니다. 내가 가지고있는 문제는 입력 텍스트를 표시하려고 할 때입니다. 아래는이 작업을 위해 만든 두 가지 기능입니다. 내 코드에 뭔가 빠졌습니까? 내가 문자열을 표시 할TkInter 입력 위젯에서 문자열 가져 오기

def getArea(): 

    x1 = StringVar() 
    x2 = StringVar() 
    y1 = StringVar() 
    y2 = StringVar() 

    #coor x1 
    labelX1 = Label(input, text="X: ").grid(row=1, column=1) 
    entryX1 = Entry(input, width=8, textvariable=x1).grid(row=1, column=2) 
    #coor x2 
    labelY1 = Label(input, text="Y: ").grid(row=2, column=1) 
    entryY1 = Entry(input, width=8, textvariable=y1).grid(row=2, column=2) 
    #coor y1 
    labelX2 = Label(input, text="X: ").grid(row=1, column=3) 
    entryX2 = Entry(input, width=8, textvariable=x2).grid(row=1, column=4) 
    #coor y2 
    labelY2 = Label(input, text="Y: ").grid(row=2, column=3) 
    entryY2 = Entry(input, width=8, textvariable=y2).grid(row=2, column=4) 

    x1.set("Defalut value x1") 
    x2.set("Defalut value x2") 
    y1.set("Defalut value y1") 
    y2.set("Defalut value y2") 

    coorx1 = x1.get() 
    coorx2 = x2.get() 
    coory1 = y1.get() 
    coory2 = y2.get() 

    button = Button(input, text='ok',command=lambda: showResults(coorx1,coorx2,coory1,coory2)).grid(row=1, column=5) 

    exitButton = Button(input, text='exit', command=input.destroy).grid(row=2,column=5) 

    input.mainloop() 

이 내 두 번째 기능입니다 :

이 내가 엔트리 위젯을 만들어 내 첫 번째 기능입니다

해결해야 할 많은 것들이 있습니다
def showResults(x1,x2,y1,y2): 
showInfo = Tk() 
showInfo.title("Location Temperature") 
showInfo.geometry("270x100+470+320") 

print x1, x2, y1, y2 

info1 = Label(showInfo, text=x1).pack() 
info2 = Label(showInfo, text=x2).pack() 
info3 = Label(showInfo, text=y1).pack() 
info4 = Label(showInfo, text=y2).pack() 

buttonClose = Button(showInfo, text='exit', command=showInfo.destroy).pack(side= RIGHT) 
showInfo.mainloop() 
+0

"버튼"을 눌러 다른 창을 열면 오류가 발생합니다. 아무 것도 표시하지 않고 "기본값"만 표시합니다. 나는이 "디폴트 값"없이 이것을 시도하고 아무 것도 얻지 못했다. – user1661865

+0

전체 코드입니까? – Tadgh

답변

3

코드로 첫 번째는 Tk의 두 인스턴스를 생성하는 것입니다. Tkinter는 클래스의 인스턴스 하나만 생성하고 해당 인스턴스의 mainloop을 정확히 한 번 호출해야합니다. 두 번째 창이 필요하면 Toplevel의 인스턴스를 만듭니다.

두 번째로 StringVar을 사용할 필요가 없습니다. 인터넷에서 많은 예제를 사용하는 것을 알고 있지만 엄밀히 말하면 필요하지 않습니다. 엄지 손가락의 규칙에 따라 추적을 설정하려는 경우 또는 두 위젯이 동일한 변수를 공유하게하려는 경우 (실제로는 멋진 기능 임)에만 필요합니다. 대신 텍스트 위젯의 get 메소드를 호출하여 값을 가져올 수 있습니다. 이것의 주요 장점은 단순히 생성하고 관리해야하는 객체 수가 적다는 것입니다. 객체를 사용하도록 전환 할 경우 (전역 변수 또는 인스턴스 변수 중 하나의 항목 위젯의 각에 대한 참조를 저장할 수 있습니다

  1. :

    그래서, 당신이 할 수있는 것은 다음 중 하나입니다 지향 프로그래밍 스타일),

  2. 위젯에 대한 참조를 showResults 함수로 전달할 수 있습니다.
  3. StringVar을 계속 사용할 수 있으며 입력 위젯과 showResults 함수의 레이블을 모두 StringVar 개로 공유 할 수 있습니다. 다시 말하지만 두 함수가 사용할 수있는 방식으로 저장하거나 한 함수에서 다른 함수로 전달할 수 있어야합니다.

    button = Button(input, text='ok',command=lambda: x1=entryX1, y1=entryY1, 
        x2=entryX2, y2=entryY2: showResults(x1,y1,x2,y2) 
    ... 
    def showResults(x1,y1,x2,y2): 
        info1 = Label(showInfo, text=x1.get()) 
        info2 = Label(showInfo, text=y1.get()) 
    

    이 유일한 방법, 심지어 가장 좋은 방법이 아니다 : - 참조를 전달하고 get 방법을 사용하여 -이 같은 당신이 무언가 번째의 예를 들어

. 요점은 여기서 신비가 없다는 것입니다. 둘 이상의 함수에서 사용하는 변수와 마찬가지로 전역 참조를 어딘가에 유지하거나 참조를 전달해야합니다. 또는 textvariable 속성의 특수 속성을 활용합니다.

+0

이전 글, 알아요.하지만 도와 드릴 수 있기를 바랍니다. 나중에 사용할 수 있도록 각 위젯에 "이름을 지정하는"방법이 있습니까? 10 개의 자금 목록을 조회하고 각자 자신의 텍스트 상자가 필요하다고 가정 해 보겠습니다. 이 목록이 바뀔 수 있으므로 동적이어야합니다. 내가 만든 각각을 반복하고 그와 관련된 값을 얻고 싶습니다. – Kyle

관련 문제