2017-04-20 82 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

但是,我不能管理粘按钮“向上”,“向下”,“左”和“右”到一起。我试图查看论坛和网站,但我找不到解决方案。它应该是非常简单的,因为它只是一个布局问题。

我想应该是这样的输出..

GUI wanted

任何人能帮助我们吗?我希望这个问题对其他人也有好处,因为我不知道如何使用Tkinter,我无法通过网络找到解决方案。

预先感谢您。

回答

1

您可能需要稍微重构网格......
在这种情况下,您的列表框会占用与按钮一样多的行。所以行的高度将均匀分散在列表框的高度上,并且按钮均匀地沿列表框高度放置。但是,如果您希望将按钮组合在一起,则最后一个按钮后面的行必须“拉伸”以考虑额外的空间。
也许这(笨拙)ASCII艺术将展示...
--------- | 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会自动假定它不应该在那里,将它缩小到什么程度并延伸其他。
在这种情况下,将列表框的行跨度增加1,然后调用self.rowconfigure(4, weight=1)
4是您创建新的(空!)行,weight告诉Tkinter的一个相对单位,如果你有多个rowsconfigures,也许希望有一个双重的速度扩张,这是有用扩大。
P.S.您需要将其他按钮向下移动1!

+0

你的第一个句子没有任何意义。在这种情况下给列表框设置一个明确的高度不会产生任何效果(除非设置为非常小的数字)。此外,weight_not_“告诉tkinter扩展一个单位”。我不知道在这种情况下你认为“单元”是什么,但重量只是告诉tkinter如何在小部件中分配额外的空间。 –

+0

你是对的@BryanOakley,它不扩展任何特定的单位,我不清楚 – 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")