我已经查看了关于rowconfugre和columnconfigure的文档,我只是不太明白如何让它正常工作。使用以下代码,我如何获得' src_entry'直接针对'src'的输入框检查按钮,无论第1列中的其他小部件是什么?基本上,我需要列的大小来形成网格上该空间中任何小部件的宽度。
谢谢,
from tkinter import *
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent, background="white")
self.parent = parent
self.parent.title("TCPDUMP Creator")
self.centerWindow()
self.pack(fill=BOTH, expand=1)
menubar = Menu(self.parent)
self.parent.config(menu=menubar)
fileMenu = Menu(menubar)
fileMenu.add_command(label="Exit", command=self.quit)
menubar.add_cascade(label="File", menu=fileMenu)
self.columnconfigure(2, weight=5)
int_lbl = Label(self, text="Interface")
int_lbl.grid(row=1, column=0, sticky=W+E)
self.int_entry = Entry(self, width=15)
self.int_entry.grid(row=1, column=1)
self.anyInt = BooleanVar()
Checkbutton(self, text="Any", variable = self.anyInt).grid(row=1, column=2)
int_lbl = Label(self, text="")
int_lbl.grid(row=2, column=0, columnspan=99, sticky=W+E)
self.notSrc = BooleanVar()
Checkbutton(self, text = "Not--", variable = self.notSrc).grid(row=3, column=0, sticky=W+E)
self.srcIP = BooleanVar()
Checkbutton(self, text="Src", variable = self.srcIP).grid(row=3, column=1)
src_entry = Entry(self, width=15)
src_entry.grid(row=3, column=2)
self.AndOr = StringVar()
self.AndOr.set(None)
Radiobutton(self, text = "And", variable = self.AndOr, value = "And").grid(row=3, column=3, pady=5, padx=2, sticky=E)
Radiobutton(self, text = "Or", variable = self.AndOr, value = "Or").grid(row=3, column=4, pady=5, padx=10, sticky=W)
self.notDst = BooleanVar()
Checkbutton(self, text = "Not--", variable = self.notDst).grid(row=3, column=5, sticky=W+E)
self.dstIP = BooleanVar()
Checkbutton(self, text="Dst", variable = self.dstIP).grid(row=3,column=6, sticky=E, padx=0)
dst_entry = Entry(self, width=15)
dst_entry.grid(row=3, column=7)
int_lbl = Label(self, text="")
int_lbl.grid(row=4, column=0, columnspan=99, sticky=W+E)
self.srcordst = StringVar()
self.srcordst.set(None)
Radiobutton(self, text = "And", variable = self.srcordst, value = "And").grid(row=4, column=1, pady=5, padx=2, sticky=E)
Radiobutton(self, text = "Or", variable = self.srcordst, value = "Or").grid(row=4, column=2, pady=5, padx=10, sticky=W)
def centerWindow(self):
w = 600
h = 300
sw = self.parent.winfo_screenwidth()
sh = self.parent.winfo_screenheight()
x = (sw - w)/2
y = (sh - h)/2.7
self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y))
def main():
root = Tk()
app = Example(root)
root.mainloop()
if __name__ == '__main__':
main()
答案 0 :(得分:2)
做布局的最好方法是将UI分成几个部分,然后独立地布局每个部分。你遇到困难的原因是你试图强迫所有部分进入一个网格,但是你没有有自然适合网格的项目。您可以通过使用大量不可见的列并巧妙地使用columnspan
来使其工作,但有更简单的方法。
在这种特定情况下,pack
和一些中间框架在我看来是更好的解决方案。
据我所知,你的用户界面由四个方面组成:
int_entry
条目和检查按钮我这样做的方法是创建四个帧,每个区域一个:
frame1 = Frame(self, ...)
frame2 = Frame(self, ...)
frame3 = Frame(self, ...)
frame4 = Frame(self, ...)
然后,您可以使用pack
水平堆叠这些帧。所有这些都在水平方向上填充它们的区域,最后一帧占用所有其余数据。
frame1.pack(side="top", fill="x")
frame2.pack(side="top", fill="x")
frame3.pack(side="top", fill="x")
frame4.pack(side="top", fill="both", expand=True)
现在,您可以为每个帧添加小部件,而不必担心它们如何影响显示的其余部分。
例如,“Interface”标签,条目和“Any”检查按钮可以在frame1中。 pack
是一个明智的选择,因为你希望这些对齐到区域的左边(我假设......)。
int_lbl = Label(frame1, text="Interface")
self.int_entry = Entry(frame1, width=15)
any_cb = Checkbutton(frame1, text="Any", ...)
int_lbl.pack(side="left")
self.int_entry.pack(side="left")
any_cb.pack(side="left")
对其他帧执行相同操作。在每个框架中,您可以选择使用pack
或grid
,只要您始终对框架内的每个窗口小部件使用pack
或grid
即可。当您希望所有窗口小部件在父窗口小部件中的一个方向上对齐时,pack
是一个非常自然的选择。