2012-07-17 63 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 2012-07-17 18:26:25

+0

@mgilson我想這可能是怎麼回事。我使用pack將frame壓縮到其中一個組件上,這樣我就可以實現我正在處理的其他一些功能。當我把網格放在那裏時,這會導致掛起。 – Squid1361 2012-07-17 18:36:32

+0

也許吧。我對「pack」的瞭解不多,因爲我從來沒有使用過它(這對我來說非常直觀,但有些人似乎使用它很多......)。 – mgilson 2012-07-17 18:45:07

回答

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」中拉出(可能通過「root.children」將幀清楚地排序並以某種方式找出你想要的幀)。最好這是凌亂的。 – mgilson 2012-07-17 18:24:44

+0

我完全同意,爲了一個簡短的例子,我在同一行上進行網格化。我現在編輯它。 – smont 2012-07-17 18:30:42

+1

@mgilson。 OP應該能夠將其分開以滿足他的需求。這只是一個玩具示例,展示瞭如何完成。 – 2012-07-17 18:32:12