2017-04-20 1 views
1

나는 Tkinter을 사용하여 새롭고 정말 쉬운 GUI를 만들고 있습니다. JavaFX 배경에서 오는 것은 좌표에 내 버튼 위치를 지정할 수 없기 때문에 다소 혼란 스럽습니다.레이아웃 - Tkinter - 함께 버튼 그룹화

이 내 실제 코드 :

class MoveRobot(Frame): 

grid_counter = 0 

def __init__(self): 
    Frame.__init__(self) 
    self.master.title("Control Robot") 
    self.master.geometry("400x400") 
    self.master.rowconfigure(0, weight=1) 
    self.master.columnconfigure(0, weight=1) 
    self.grid(sticky=W + E + N + S) 

    self.list_box = Listbox(self) 
    self.list_box.grid(rowspan=4, sticky=W + E + N + S) 

    self.button1 = Button(self, text="UP", command=self.button_up) 
    self.button1.grid(row=0, column=1, columnspan=2, sticky=W + E + N + S) 

    self.button2 = Button(self, text="DOWN", command=self.button_down) 
    self.button2.grid(row=1, column=1, columnspan=2, sticky=W + E + N + S) 

    self.button3 = Button(self, text="LEFT", command=self.button_left) 
    self.button3.grid(row=2, column=1, columnspan=2, sticky=W + E + N + S) 

    self.button4 = Button(self, text="RIGHT", command=self.button_right) 
    self.button4.grid(row=3, column=1, columnspan=2, sticky=W + E + N + S) 

    self.button_cancel = Button(self, text="Remove Last", command=self.button_remove_last) 
    self.button_cancel.grid(row=4, columnspan=2, sticky=W + E + N + S) 

    self.button_cancel = Button(self, text="Clear", command=self.button_clear) 
    self.button_cancel.grid(row=5, columnspan=2, sticky=W + E + N + S) 

    self.button_compile = Button(self, text="Compile", command=self.button_compile) 
    self.button_compile.grid(row=6, columnspan=2, sticky=W + E + N + S) 

    self.rowconfigure(1, weight=1) 
    self.columnconfigure(1, weight=1) 

#controller code is removed because unnecessary 

def main(): 
    MoveRobot().mainloop() 

if __name__ == "__main__": 
    main() 

그리고 아래에있는 내 GUI를 만든 사람.

GUI built it from the code provided

그러나, 나는 함께 'UP'버튼, 'DOWN', 'LEFT'과 '오른쪽'을 충실 관리 할 수 ​​없습니다. 포럼과 웹 사이트를 살펴 보았지만 해결책을 찾지 못했습니다. 그것은 단지 레이아웃 문제이기 때문에 꽤 직설적이어야합니다.

나는 이런 식으로 뭔가를해야 원하는 출력 ..

GUI wanted

사람은 도움을 줄 수있다? 나는이 질문이 다른 사람들에게도 도움이되기를 바랍니다. 왜냐하면 나는 Tkinter를 사용하는 방법을 모르며 웹을 통해 해결책을 찾을 수 없기 때문입니다.

미리 감사드립니다.

답변

1

그리드를 약간 재구성해야 할 수도 있습니다 ...
이 경우 목록 상자는 버튼만큼 많은 행을 차지합니다. 따라서 행의 높이는 목록 상자의 높이 위에 고르게 분산되며 버튼은 목록 상자 높이를 따라 고르게 배치됩니다. 그러나 단추를 맨 위에 그룹화하려면 마지막 단추 다음의 행이 추가 공간을 고려하여 '늘어납니다'.
어쩌면이 (서투른) 아스키 - 예술이 보여줄 것입니다 ...
--------- | lb | Box 1 (row 1) | lb | Box 2 (row 2) | lb | Box 3 (row 3) | lb | xxxxx (row 4) | lb | xxxxx (still row 4) --------- Other boxes
이 솔루션은 rowconfigure입니다!
tkinter가 확장 할 여유 공간이있는 경우 행을 확장하는 방법을 tkinter에 알려줍니다.
행이 비어 있으면 tkinter는 자동으로 그 행이 없어야한다고 가정하고, 아무것도 줄이지 않고 다른 행을 확장하기 때문에 필요합니다.
이 경우 목록 상자의 행 간격을 1 늘린 다음 self.rowconfigure(4, weight=1)으로 전화하십시오.
4는 새로 만든 (빈 행)입니다. weight은 tkinter를 하나의 상대 단위로 확장하도록 지시합니다.이 경우 복수형이 rowsconfigures이고 두 배로 빠르게 확장하고자 할 때 유용합니다.
P. 다른 버튼을 1 씩 내릴 필요가 있습니다!

+0

첫 번째 문장은 의미가 없습니다. 목록 상자에 명시적인 높이를 지정하면이 경우 아무 것도 수행하지 않습니다 (실제로 작은 숫자로 설정하지 않은 경우). 또한, 가중치는 "tkinter가 한 단위 씩 확장되도록 알려줍니다"하지 않습니다. "단위"가이 컨텍스트에서 무엇이라고 생각하는지 모르지만, 가중치는 tkinter에게 위젯에 여분의 공간을 배포하는 방법을 알려줍니다. –

+0

네가 맞아 @ 브라이언 오클리, 어떤 특정 유닛에 의해 확장되지 않는다. 나는 명확하지 않다. – EriktheRed

+0

@BryanOakley 그러나 나는 명시적인 높이에 관해 말한대로 서있다. 목록 상자가 레이아웃 (내 ascii 참조)에 있어야하는 것보다 큼을 감안할 때, tkinter는 크기가 얼마나 커야 하는지를 제외하고는 축소 할 것입니다.이 문제를 해결하는 다른 방법이있을 수 있지만, 가장 간단한 방법 인 것처럼 보입니다. 나, 그리고 내가 한 일부 테스트에서 작동합니까 – EriktheRed

2

레이아웃 문제를 해결하려면 UI를 여러 섹션으로 나누고 한 번에 한 섹션에 집중해야합니다. 귀하의 경우에는 왼쪽의 목록 상자, 오른쪽의 단추 그룹 및 아래쪽의 단추 그룹의 세 섹션이 있습니다.

오른쪽의 버튼에 대해 구체적으로 묻는 것이므로이 답변에서 다루는 그룹입니다. 제 생각에는

는 가장 쉬운 해결책은 버튼에 대한 프레임을 만든 다음 프레임의 상단에있는 버튼을 포장하지하는 것입니다 : 당신이 그 프레임을 넣을 위치에 상관없이 그와

button_frame = Frame(self) 
self.button1 = Button(button_frame, ...) 
self.button2 = Button(button_frame, ...) 
self.button3 = Button(button_frame, ...) 
self.button4 = Button(button_frame, ...) 

self.button1.pack(side="top", fill="x") 
self.button2.pack(side="top", fill="x") 
self.button3.pack(side="top", fill="x") 
self.button4.pack(side="top", fill="x") 

의 버튼은 항상 맨 위에 표시됩니다.귀하의 경우 목록 상자와 프레임을 같은 행에 넣을 수 있습니다.

self.list_box.grid(row=0, column=0, sticky="nsew") 
    button_frame.grid(row=0, column=1, sticky="nsew")