2014-01-07 4 views
0

다음 코드를 실행하면 만든 격자가 입력 상자 위쪽에 동일한 격자에 추가되지 않은 것처럼 나타납니다.Tkinter에서 Entry의 위에 나타나는 레이블

class Application(Frame): 
    def __init__(self,master): 
     super(Application,self).__init__(master) 
     self.grid() 
     self.new_intervals() 

    def new_intervals(self): 
     self.int_label = Label(text="Interval Name") 
     self.int_label.grid(row=0, column=0,sticky=W) 
     self.int_time_label = Label(text="Time (HH:MM:SS)") 
     self.int_time_label.grid(row=0, column=1,sticky=W) 
     self.box1 = Entry(self) 
     self.box1.grid(row=1,column=0,sticky=W) 
     self.box2 = Entry(self) 
     self.box2.grid(row=1,column=1,sticky=W) 
     self.box3 = Entry(self) 
     self.box3.grid(row=2,column=0,sticky=W) 
     self.box4 = Entry(self) 
     self.box4.grid(row=2,column=1,sticky=W) 


root = Tk() 
root.title("Interval Timer") 
root.geometry("400x500") 
app=Application(root) 
root.mainloop() 

내가 루프에서이 상자를 추가 할 수 있다는 것을 알고 있지만, 나는 순간 응용 프로그램 프레임은 행 0에

답변

2
  • , 열을 루프없이 동작하지 않습니다 0을 입력합니다. 아무것도 지정하지 않으면 기본값입니다. 또한 기본값으로, 중간에 나타납니다.
  • 이 프레임에는 두 행에 걸쳐 펼쳐지는 4 개의 입력 위젯이 있습니다.이 프레임은 해당 항목 위젯에 맞게 확대됩니다.
  • "간격 이름"레이블도 행 0에 배치됩니다 , 메인 윈도우의 열 0, 왜냐하면 당신이 명시 적으로 그것을하기 위해 말했기 때문에, 그리고 부모가 메인 윈도우이기 때문입니다.
  • "시간"레이블도 기본 창의 행 0이므로 이 레이블은 행의 세로 가운데에 나타나므로 기본 동작이므로 당신은 오버라이드하지 않았기 때문에 엔트리 위젯 위에 나타나는 이유입니다.

레이블과 응용 프로그램 프레임이 기본 창의 동일한 행에 있고 기본적으로 레이블이 세로 가운데에 있기 때문에 항목 위젯의 중간에있는 것처럼 보입니다. 을 만들 때

난 당신이 프레임의 자녀가 될 수있는 라벨을위한 가정, 그래서 당신은 첫 번째 매개 변수로 "자기"를 지정해야합니다

self.int_label = Label(self, text="Interval Name") 
... 
self.int_time_label = Label(self, text="Time (HH:MM:SS)") 

나는 또한 그리드의 모든 조건을 그룹화하는 것이 좋습니다 특정 마스터 창을 함께 사용하면 위젯의 구성을 더 쉽게 볼 수 있습니다. 내 경험상이 코드는 읽기 쉽고 유지 보수가 쉬워졌습니다. 예를 들어

:

self.int_label = Label(...) 
self.int_time_label = Label(...) 
self.box1 = Entry(...) 
... 
self.int_label.grid(...) 
self.int_time_label.grid(...) 
self.box1.grid(...) 
... 
관련 문제