2012-07-17 8 views
1

는이 같은 프레임의 스택이 있습니다빠른 Tkinter의 서식 문제

+--+ 
    | | 
    +-+--+-+ 
    |  | 
+-+------+-+ 
|   | 
+----------+ 

을하지만이처럼 원하는 :

 +--+ 
     | | 
    +---+--+ 
    |  | 
+---+------+ 
|   | 
+----------+ 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

팩을 사용 중이므로 제대로 작동하지 못했습니다. 어떤 이유로 그리드를 사용하지 않아서 프로그램이 전혀 표시되지 않고 프로그램이 멈 춥니 다.

# Main script 
root = Tk() 
root.geometry('500x500') 
for task in TaskList: 
    GuiTools.TaskBox.TaskBox(root, task) 
root.mainloop() # program hangs from this line, to the point of having to use kill to close it 



# Taskbox class 
class Taskbox(master, task): 
    __init__(self) 
     self.TaskFrame = Frame(master, borderwidth=3, relief=RAISED) 
     . . . 
     Putting stuff in frame 
     . . . 
     self.TaskFrame.pack() # Gives result 1 
     #self.TaskFrame.grid(column=1, sticky='ne') # no display, causes hang 
+0

특정 프레임 또는 최상위에 위젯을 부착하는 경우 'pack' 또는 모두'grid'를 사용하십시오. 그렇지 않으면,'tk'는 영원히 당신의 위젯을위한 적당한 위치를 찾아내는 것을 행복하게 시도 할 것입니다. – mgilson

+0

@mgilson 나는 이것이 아마도 진행되고 있다고 생각한다. 팩을 사용하여 구성 요소 중 하나에 프레임을 축소 포장하여 다른 일부 기능을 수행 할 수 있습니다. 그리드를 놓으면 내리 죠. – Squid1361

+0

아마도. 나는 결코 그것을 사용하지 않기 때문에'pack'에 대해 많이 알지 못한다. (그것은 나를 위해 매우 직관적이지만, 어떤 사람들은 그것을 많이 사용하는 것처럼 보인다.). – mgilson

답변

1

이 까다로운 약간 당신이 첫번째 장소에있는 프레임으로 퍼팅을하는지 모르고 대답하는 것입니다. @ sc0tt는 아마도 sticky=tk.E을 사용하고자하는 것이 맞지만, myframe.grid_propagate(False)을 제외하고는 프레임을 넣을 때 프레임의 크기가 조정되기 때문에 원하는 것을 얻는 데 충분하지 않을 수 있습니다. 이에 대한 해결책은 columnspan 키워드에도 넣는 것입니다.

import Tkinter as tk 
root = tk.Tk() 
frames = [] 
for i in range(3): 
    f = tk.Frame(root) 
    f.grid(row=i, column=0, columnspan=i+1, sticky=tk.E) 
    frames.append(f) 

#Now, you can add buffer spaces (frames) into the grid at 
# `row=0,column=0`, `row=0,column=1` and `row=1,column=1` if you need it. 

root.mainloop() 

이 효과적으로이 같은 그리드 파티션 : 여기

당신이 원하는 같은 것을 할 것입니다 바보 루프의

+----+-----+-----+ 
| |  |  | 
+----+-----+-----+ 
| |   | 
+----+-----------+ 
|    | 
+----------------+ 
4

당신은 거의 가지고 있습니다. 창에 위젯을 추가하기 전에 mainloop을 시작하면 mainloop이 끝날 때까지 추가되지 않습니다. 메인 루프가 끝나면 창을 더 이상 사용할 수 없으므로 창을 추가 할 수 없습니다.

여기 당신이 원하는 방법과 같은 서로 상단에 3 프레임의 빠른 예제 :

import Tkinter 

root = Tkinter.Tk() 
frame_one = Tkinter.Frame(root, width="50", height="50", borderwidth=3, relief=Tkinter.RAISED) 
frame_one.grid(row=0, column=0, sticky=Tkinter.E) 

frame_two = Tkinter.Frame(root, width="100", height="100", borderwidth=3, relief=Tkinter.RAISED) 
frame_two.grid(row=1, column=0, sticky=Tkinter.E) 

frame_three = Tkinter.Frame(root, width="150", height="150", borderwidth=3, relief=Tkinter.RAISED) 
frame_three.grid(row=2, column=0, sticky=Tkinter.E) 

root.mainloop() 
+1

OP에 프레임을 만들고 한 줄에 모아 놓으라고 말하지 마십시오. 이제'.grid'가'None'을 반환하기 때문에 당신이 만든 프레임에는 (쉬운) 핸들이 없습니다. 방금 작성한 프레임을 실제로 사용하는 유일한 방법은 어떻게 든 '루트'에서 꺼내는 것입니다 (아마도 'root.children'을 통해 프레임을 명시 적으로 정렬하고 어떤 것을 원하는 것으로 결정했는지 ...). 기껏해야 지저분 해. – mgilson

+0

전적으로 동의합니다. 짧은 예제를 위해 같은 줄에 그리드했습니다. 나는 지금 그것을 편집 할 것이다. – smont

+1

@ mgilson. OP는 자신의 필요에 맞게이 문제를 해결할 수 있어야합니다. 이것은 그것이 어떻게 행해지는지 보여주는 장난감의 예일뿐입니다. –