快速Tkinter格式问题

时间:2012-07-17 18:01:29

标签: python 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

2 个答案:

答案 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()