2017-11-23 3 views
0

tkinter를 사용하여 파이썬 그리드 레이아웃을 이해하는 것이 매우 어렵습니다. 여기에 내가 만드는 방법을 이해하려고하는 레이아웃이 있습니다. 내가 8 개 프레임을 만들 것 이해하는 것과tkinter에서 그리드 레이아웃을 사용하여 위젯을 배치하는 방법

Layout

. 상단 프레임은 상위 3 개 프레임을 포함하고 0의 행과 3의 columnspan을 갖습니다. 아래쪽 프레임은 아래쪽 3 개 프레임을 포함하고 1의 행과 3의 columnspan을가집니다. 이해할 수없는 한 가지는 sticky 속성이 어떻게 작동하고이 부분에 영향을 주는지. 내가 이해할 수없는 또 다른 것은 grid_rowconfigure/columnconfigure의 가중치이다. 내가보기에 각 프레임을 다른 속도로 성장시켜야한다고 생각하니? 가중치가 높을수록 더 작은 수와 비교됩니다 (즉, 다른 프레임에서 3의 가중치를 갖는 가중치는 3이 1의 크기의 1/3로 증가한다는 것을 의미합니다). ctrleft 프레임의 위젯은 마치 팩을 사용하여 직선을 만들고 패딩을 변경하여 해당 위치에 설정할 수있는 것처럼 보입니다. 내가 틀렸어? 도움을받을 시간이있는 사람은 미리 감사드립니다.

+0

[스크립트를 제공 할 수 있습니까?] (https://stackoverflow.com/help/) mcve) – Simon

+0

이 질문 중 간단한 시행 착오를 통해 스스로 대답 할 수는 없습니다. 기대했던 것과 다르게 보이는 경우 무언가를 시도해보십시오. 그 이유를 말할 수 없으므로 여기에 질문을 게시하십시오. – Nae

답변

2

작업을 수행하는 데는 여러 가지 방법이 있습니다. 중요한 것은 한 번에 모든 레이아웃 문제를 해결하려고 시도하지 않는 것입니다. 당신은 "분열과 정복"접근법을 취해야합니다. UI를 논리적 그룹으로 나누고 그룹을 정렬 한 다음 각 그룹을 더 작은 그룹으로 나누고 정렬합니다.

예를 들어, 여기에 내가이 특정한 배열을 할 수있는 방법은 다음과 같습니다

내가 여섯 개 기능 (또는 6 개 클래스, 당신이 선호하는 경우), 각 주요 섹션 하나를 작성하여 시작할 것

. gui 코드의 주요 부분은 다음과 같습니다.

class Example(object): 
    def __init__(self): 
     root = tk.Tk() 
     topleft = self.create_topleft() 
     topmid = self.create_topmid() 
     ... 

논리 배열은 2x3 격자로 보입니다. 마지막으로

class Example(object): 
    def __init__(self): 
     ... 
     root.grid_rowconfigure(0, weight=1) 
     root.grid_rowconfigure(1, weight=1) 
     root.grid_columnconfigure(0, weight=1) 
     root.grid_columnconfigure(0, weight=1) 
     root.grid_columnconfigure(1, weight=1) 

, 내가 것 : 가정 당신은 모든 부분이 동일하게 확장 할 수 창 크기를 조정할 때 여분의 공간이 동일하게 행과 열 사이에 분리되도록, 나는 모든 행과 모든 열 모두 동일한 무게를 줄 수 원하는 그리드에 위젯을 배치하십시오.

class Example(object): 
    def __init__(self): 
     ... 
     topleft.grid(row=0, column=0, sticky="nsew") 
     topmid.grid(row=0, column=1, sticky="nsew") 
     ... 

이렇게하면 UI의 일반 구조가 설정됩니다. 다른 위젯을 추가하지 않고 크기 조정 동작을 테스트 할 수도 있습니다. 각 섹션에 고유 한 색과 임시 크기를 부여한 다음 창의 크기를 조정하여 각 섹션의 응답 방식을 확인하십시오.

이제 각 섹션이 나머지 GUI에 어떻게 영향을 미치는지 걱정하지 않고도 각 섹션을 독립적으로 개발할 수 있습니다. 예를 들어, 일부 섹션의 위젯은 pack을 사용할 수 있으며, 일부는 grid을 사용할 수 있으며 가장 적합한 경우 place을 사용할 수도 있습니다.

예를 들어 ctrmid은 상단에 큰 위젯이 있고 하단에 작은 위젯이 있기 때문에 pack에 적합합니다.

ctrleft 자체는 두 개의 레이블과 내부 프레임처럼 보입니다. 이들은 pack으로 배열 될 수 있지만, 내부 프레임 내부의 위젯은 grid을 사용하여 테이블을 구성 할 수 있습니다.

내가 이해할 수없는 또 다른 사항은 grid_rowconfigure/columnconfigure의 가중치입니다. ... (즉,다른 프레임에 3의 가중치를 갖는 1의 가중치는 3이 1의 1/3 크기로 성장할 것임을 의미합니다.

당신은 거꾸로 가지고 있습니다. 가중치는 추가 공간이 할당되는 방법을 설명하며 가중치는 비례합니다. 가중치가 2이면 행 또는 열이 가중치가 1 인 열의 두 배가 넘는 추가 공간을 얻게됩니다.

관련 문제