我有一堆像这样的框架:
+--+
| |
+-+--+-+
| |
+-+------+-+
| |
+----------+
但我希望他们这样:
+--+
| |
+---+--+
| |
+---+------+
| |
+----------+
这样做的最佳方式是什么?
使用包装并无法让他们表现得正确。出于某种原因,使用网格根本不显示它们,我的程序挂起
# 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 :(得分: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 :(得分:1)
在不知道你首先放入框架的情况下回答这个问题有点棘手。 @ sc0tt是正确的,你可能想要使用sticky=tk.E
,但这可能不够好,无法获得你想要的东西,因为你的框架可能会根据你放入的内容自行调整大小(除非你{{1} }})。解决方法是同时输入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()