Python 管理列宽tkinter
我已经阅读了关于rowconfugre和columnconfigure的文档,但我不太明白如何让它正常工作。在下面的代码中,我如何直接根据“src”复选按钮获取“src_entry”输入框,而不管第1列中还有什么其他小部件?本质上,我需要将列的大小设置为网格上该空间中任何小部件的宽度 谢谢Python 管理列宽tkinter,python,tkinter,Python,Tkinter,我已经阅读了关于rowconfugre和columnconfigure的文档,但我不太明白如何让它正常工作。在下面的代码中,我如何直接根据“src”复选按钮获取“src_entry”输入框,而不管第1列中还有什么其他小部件?本质上,我需要将列的大小设置为网格上该空间中任何小部件的宽度 谢谢 from tkinter import * class Example(Frame): def __init__(self, parent): Frame.__init__(s
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()
布局的最佳方法是将UI分成多个部分,然后独立地布局每个部分。您遇到困难的原因是,您试图将所有内容强制放到一个网格中,但没有适合网格的项。通过使用大量不可见的列和巧妙地使用
columnspan
,您可以使其工作,但有更简单的方法
在这种特殊情况下,包和一些中间帧在我看来是更好的解决方案
据我所见,您的UI由四个区域组成:
具有int\u entry
条目和复选按钮的行
具有多个复选框和单选按钮以及一个条目的行
带有“And”和“And”或“Or”单选按钮的行
一个很大的空白区域
我的方法是创建四个帧,每个区域一个:
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)
现在,您可以向每个帧添加小部件,而不必担心它们如何影响其余的显示
例如,“接口”标签、条目和“任意”复选按钮可以放在frame1中<代码>打包
是一个明智的选择,因为您希望这些文件与区域左侧对齐(我假设…)
对其他帧执行相同的操作。在每个框架内,您可以选择使用
pack
或grid
,只要您始终对框架内的每个小部件使用pack
或grid
<当您希望所有小部件在父小部件中沿一个方向对齐时,code>pack是一个非常自然的选择 进行布局的最佳方法是将UI划分为多个部分,然后独立地对每个部分进行布局。您遇到困难的原因是您试图将所有内容强制放到一个网格中,但您没有自然适合网格的项目。通过使用大量不可见的列和巧妙地使用columnspan
,您可以使其工作,但有更简单的方法
在这种特殊情况下,包和一些中间帧在我看来是更好的解决方案
据我所见,您的UI由四个区域组成:
具有int\u entry
条目和复选按钮的行
具有多个复选框和单选按钮以及一个条目的行
带有“And”和“And”或“Or”单选按钮的行
一个很大的空白区域
我的方法是创建四个帧,每个区域一个:
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)
现在,您可以向每个帧添加小部件,而不必担心它们如何影响其余的显示
例如,“接口”标签、条目和“任意”复选按钮可以放在frame1中<代码>打包
是一个明智的选择,因为您希望这些文件与区域左侧对齐(我假设…)
对其他帧执行相同的操作。在每个框架内,您可以选择使用
pack
或grid
,只要您始终对框架内的每个小部件使用pack
或grid
<当您希望所有小部件在父小部件中沿一个方向对齐时,code>pack是一个非常自然的选择 谢谢你,布莱恩,这很有效,我感谢你的快速反应。谢谢你,布莱恩,这很有效,我感谢你的快速反应。