2010-02-14 5 views
4
b = Button(root, text="Enter", width=10, height=2, command=button1) 
b.config() 
b.pack(side=LEFT) 

c = Button(root, text="Clear", width=10, height=2, command=clear) 
c.pack(side=LEFT) 


scrollbar = Scrollbar(root) 
scrollbar.pack(side=RIGHT, fill=Y) 
text.config(width=35, height=15) 
text.pack(side=RIGHT, fill=Y) 
scrollbar.config(command=text.yview) 
text.config(yscrollcommand=scrollbar.set) 

어떻게이 2 개의 버튼을 텍스트 위젯의 서로 다른 꼭지점 옆에 넣을 수 있습니까? "side = LEFT"로 설정하면 텍스트 위젯 옆에 2 개의 버튼 만 놓습니다.어떻게 2 개의 버튼을 서로 옆에 놓을 수 있습니까?

답변

12

일반적으로이 유형의 문제에 대한 두 가지 해결책이 있습니다. 모든 상황이나이 특별한 예에서 다른 어느 것보다 낫지 않습니다. 두 가지 솔루션 모두 완벽하게 수용 할 수 있습니다.

해결 방법 1 : 두 개의 컨테이너 (일반적으로 프레임)를 사용하십시오. 하나는 가로 항목을, 다른 하나는 세로 항목을 보유합니다. 이 경우 루트 창은 수직으로 쌓인 항목의 컨테이너 역할을 할 수 있습니다. 두 개의 버튼을 수평 프레임 (pack (side = LEFT) 사용)에 놓은 다음 해당 프레임을 텍스트 위젯 (pack (side = TOP) 사용) 위에 놓습니다.

해결 방법 2 : 그리드에 UI를 배치하는 그리드 형상 관리자를 사용하십시오. 버튼을 셀 0,1 및 0,2에 배치하고 텍스트 위젯을 1,1 열 두 열에 배치합니다.

일반적으로 그리드를 사용하려면 약간의 선행 계획이 필요합니다. 어느 항목이 열 또는 행을 확장해야하는지, 위젯이 크기가 변경됨에 따라 어떤 열이나 행이 커지고 축소되어야하는지 파악해야합니다. 팩 솔루션은 "쉬운"개념입니다 (어쨌든 "쉬운"에 대한 일부 정의의 경우) 이와 같은 매우 간단한 레이아웃의 경우.

프레임을 사용하여 위젯 그룹을 포함하는 일반적인 기술은 좋은 방법입니다. 그룹 전체의 위젯 세트를 쉽게 관리 할 수 ​​있습니다. 위젯의 왼쪽에서 오른쪽 그룹과 위젯의 위아래 그룹을 혼합하고 일치시킬 수 있습니다.

이것은 다중 프레임 기술을 사용하여 수행하는 방법입니다. 위젯을 내부 프레임의 하위가 아닌 루트의 하위로 어떻게 생성하는지 확인하십시오. 이렇게하면 나중에 레이아웃을 수정하는 것이 더 쉬워집니다. 위젯 계층을 수정하지 않고도 다양한 프레임을 만들거나 제거하면됩니다.

# create the main sections of the layout, 
# and lay them out 
top = Frame(root) 
bottom = Frame(root) 
top.pack(side=TOP) 
bottom.pack(side=BOTTOM, fill=BOTH, expand=True) 

# create the widgets for the top part of the GUI, 
# and lay them out 
b = Button(root, text="Enter", width=10, height=2, command=button1) 
c = Button(root, text="Clear", width=10, height=2, command=clear) 
b.pack(in_=top, side=LEFT) 
c.pack(in_=top, side=LEFT) 

# create the widgets for the bottom part of the GUI, 
# and lay them out 
text = Text(root, width=35, height=15) 
scrollbar = Scrollbar(root) 
scrollbar.config(command=text.yview) 
text.config(yscrollcommand=scrollbar.set) 
scrollbar.pack(in_=bottom, side=RIGHT, fill=Y) 
text.pack(in_=bottom, side=LEFT, fill=BOTH, expand=True) 

그리드를 사용한 순진한 구현은 다음과 같습니다. 그것은 당신이 원하는 것일 수도 아닐 수도있는 다른 크기 조절 행동을합니다. 그것은 정말로 원하는 크기 조정 동작에 달려 있습니다. 일반적으로 프레임이있는 컨트롤 행을 관리하고 그리드를 사용하여 다른 위젯과 레이아웃을 지정합니다. 이 예제에서는 모든 것에 그리드를 사용합니다.

위젯이있는 행과 열을 관리하는 것 외에도 행과 열의 가중치를 결정해야합니다. 최소한 한 행과 한 열을 선택하여 "느슨하게 챙겨"야합니다. 보통 기본 위젯이있는 열 (읽기 : 대개 텍스트, 캔버스 또는 다른 프레임)이 들어간 것을 의미합니다.

b = Button(root, text="Enter", width=10, height=2, command=button1) 
c = Button(root, text="Clear", width=10, height=2, command=clear) 
b.grid(row=0,column=0, sticky=W) 
c.grid(row=0,column=1, sticky=W) 

textframe = Frame(root) 
textframe.grid(in_=root, row=1, column=0, columnspan=3, sticky=NSEW) 
root.columnconfigure(0, weight=1) 
root.rowconfigure(1, weight=1) 

text = Text(root, width=35, height=15) 
scrollbar = Scrollbar(root) 
scrollbar.config(command=text.yview) 
text.config(yscrollcommand=scrollbar.set) 
scrollbar.pack(in_=textframe, side=RIGHT, fill=Y) 
text.pack(in_=textframe, side=LEFT, fill=BOTH, expand=True) 

이 경우 특정의 경우 첫 번째 방법은 패키지가있는 방법을 선택합니다. 더 복잡한 디자인을 위해 나는 거의 항상 격자와 팩의 혼합을 사용할 것입니다. 가로 또는 세로로 자연스럽게 쌓이는 항목 (예 : 도구 모음)에는 팩을 사용하십시오. 더 복잡한 레이아웃 (예 : 전체 앱, 스크롤 막대가있는 위젯, 대화 상자 등)에 그리드를 사용하십시오. 동일한 컨테이너에 그리드와 팩을 동시에 사용할 수는 없지만 하나의 컨테이너에는 팩을, 다른 컨테이너에는 팩을 사용할 수 있습니다.

+0

"솔루션 2"수행 방법에 대한 예제 코드를 보여 주실 수 있습니까? 나는 그것을 감사하겠습니다. – sourD

관련 문제