tkinter tk.grid

转载:https://blog.csdn.net/hepu8/article/details/89417831

用Tkinter打造GUI开发工具(12)Tkinter小部件的grid布局
部件的网格放置grid()方法是使用行列位置的方法放置部件。 grid()方法布局管理器会将控件放置到一个二维的表格里。主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件。
grid()是Tkinter里面最为灵活的几何管理布局器。grid()方法不能和pack()方法混用。
当你设计对话框的时候,grid布局管理器是一个非常方便的工具。在大多数情况下,你只需要将所有控件放置到容器类部件中,然后使用grid将它们布局到任何你想要布局的地方。
使用pack进行布局的话,你可能需要一些额外的Frame控件,并自行调整。如果你使用grid的话,你只需要对每个控件使用grid(),所有的东西都会以合适的方式显示。
使用grid()显示一个小部件w,其语法格式如下:

1 w.grid(option=value, ...)

grid()方法参数option见表。

参数 说明

  1. column 部件所在的起始列位置。
  2. columnspan 部件的列宽,跨列数。
  3. in_ in_=w2使用。将w注册为w2部件的子部件。
  4. ipadx 设置部件里面水平方向空白区域大小。
  5. ipady 设置部件里面垂直方向空白区域大小。
  6. padx x方向间距。
  7. pady y方向间距。
  8. row 部件所在的起始行位置。
  9. rowspan 部件所跨的行数。
  10. sticky 对齐方式:NSEW(北南东西)上下右左。

由于我们的程序大多数都是矩形,因此特别适合于网格布局,即 grid 布局。
使用 grid()布局方法,至少给两个参数,用 row 表示行,用 column 表示列,其中值得注意的是 row 和 column 的编号都从 0 开始。
grid()函数还有个 sticky 参数,它可以用 N,E,S,W 表示上右下左,它决定了子部件对齐的位置。
sticky=N/S/E/W:顶端对齐/底端对齐/右对齐/左对齐。
sticky=N+S:拉伸高度,使其在水平方向上顶端和底端都对齐。
sticky=E+W,拉伸宽度,使其在垂直方向上左边界和右边界都对齐。
grid()布局直接用后面的行和列的数字来指定了它位于的位置,而不必使用其他参数。
grid()函数也支持诸如 ipadx,ipady,padx,pady,意思与pack 函数相同,默认边距是 0。
Tkinter的Grid类,除了grid()方法外,还提供有一些方法。

常用方法

  1. w.grid_bbox ( column=None, row=None, col2=None, row2=None )

返回一个4成员元组,描述W部件中的部分或全部网格系统的包围框。返回的前两个数字是该区域左上角的X和Y坐标,第二个数字是宽度和高度。
如果你通过参数列column和参数行row,返回的包围框描述了该列和行中单元格的区域。如果你也通过参数 col2和 row2,返回的包围框描述了从列column到col2的网格区域,并从行row 到row2包含的网格区域。
例如,w.grid_bbox(0,0,1,1)返回四个单元格的包围框,而不是一个。
w.grid_forget()
此方法使W部件从屏幕上消失。它仍然存在,只是看不见。你可以使用.grid() 使它再次出现,但它不会记得它的上次网格选项。
w.grid_info()
返回一个字典,其关键字是W的选项名,与这些grid选项对应的值。
w.grid_location ( x, y )
给定相对于包含部件的坐标 (x, y) ,此方法返回一个元组(col, row),描述W网格系统中包含该屏幕坐标的单元格。
w.grid_propagate()
通常,所有的部件都传递它们的尺寸,也就是说它们会根据内容进行调整。然而,有时候你想强迫一个部件有一定的尺寸,不管里面的东西有多大。要做到这一点,调用w.grid_propagate(0),其中W是要强制大小的部件。
w.grid_remove()
这个方法就像.grid_forget(),但它的网格grid选项被记住了,所以,如果你再来一遍 .grid(),它将使用上一次相同的网格grid配置选项。
w.grid_size()
返回在W的网格系统中。包含列数和行数的2元素元组。
w.grid_slaves ( row=None, column=None )
返回由W部件管理的部件列表。如果不提供参数,您将得到所有托管部件的列表。使用row= argument。只选择一行中的部件;或column= argument只选择列中的部件。

配置列和行大小
除非您采取某些措施,否则给定部件内的网格列的宽度将等于其最宽单元格的宽度,
网格行的高度将是其最高的单元格的高度。
如果您想要覆盖此列和行的自动调整大小,在包含网格布局的父部件W上使用这些方法:
小部件上的粘性属性sticky只控制在不完全填充单元格的情况下放置的位置。
w.columnconfigure ( N, option=value, … )
在W部件内部的网格布局中,配置列n,使给定的选项具有给定的值。有关选项,请参见下面。
w.rowconfigure ( N, option=value, … )
在W部件内部的网格布局中,配置行n,以便给定的选项具有给定的值。有关选项,请参见下面。
这里是配置列和行大小的选项。
minsize : 列或行的最小大小,单位为像素。如果在给定的列或行中没有任何内容,即使您使用此选项,它也不会出现。
pad:将添加到给定列或行的像素数,超过或超过列或行中最大的单元格。
weigh:要使列或行具有可伸缩性,请使用此选项并提供一个值,该值给出分配多余空间时,此列或行的相对权重。
例如,如果部件W包含网格布局,这些线路将分配四分之三的额外第一栏的空格和第二栏的空格:

w.columnconfigure(0, weight=3)
w.columnconfigure(1, weight=1)
如果不使用此选项,则列或行不会拉长。
下面看一个Grid示例。

 1    # -*- coding: utf-8 -*-
 2    from  time  import  sleep
 3     import  tkinter  as  tk
 4     
 5     root=tk.Tk()  #闯将 Tk主窗口
 6     colours = ['white','black','red','green','blue','cyan','yellow','magenta']
 7     lables=[]
 8     entrys=[]
 9     
10     r = 0
11     for c in colours:
12         l=tk.Label(root,text=c, relief=tk.RIDGE,width=10)
13         l.grid(row=r,column=0)
14         e=tk.Entry(root,bg=c, relief=tk.SUNKEN,width=10)
15         e.grid(row=r,column=1)
16         lables.append(l)    
17         entrys.append(e)
18         r = r + 1
19     root.update()
20     
21     sleep(5)  #暂停5秒
22     
23     lables[2].grid_forget()
24     entrys[4].grid_forget()
25     
26     lables[2].grid(row=4,column=1)
27     entrys[4].grid(row=2,column=0)
28     
29     lables[5].grid_configure(row=8,column=0,columnspan=2)
30     print(entrys[3].grid_info())
31     
32     root.mainloop() #开启Tkinter主循环

 

 

3. 随根窗口自动调整大小
您是否希望用户调整整个应用程序窗口的大小,把多余的空间分配给它的内部部件? 这需要一些不明显的操作。
有必要将这些技术用于行和列的大小管理,“配置列和行大小”,以使应用程序部件的网格可伸缩的方法,显然是是不够用的。
下面程序可以实现按钮使用grid()方法,并使部件随窗口大小而改变尺寸。

 1 # -*- coding: utf-8 -*-
 2 import  tkinter as tk
 3 class Application(tk.Frame):
 4     def __init__(self, master=None):
 5         self.master=master
 6         tk.Frame.__init__(self, master)
 7         #self.grid()
 8         self.grid(sticky=tk.N+tk.S+tk.E+tk.W)
 9         self.createWidgets2()
10 
11     def createWidgets(self):
12         self.quitButton = tk.Button ( self, text='Quit',
13                                   command=self.quit )
14         self.quitButton.grid()
15 
16 
17     def createWidgets2(self):
18         top=self.winfo_toplevel()
19         top.rowconfigure(0, weight=1)
20         top.columnconfigure(0, weight=1)
21 
22         self.rowconfigure(0, weight=1)
23         self.columnconfigure(0, weight=1)
24         self.quit = tk.Button ( self, text="Quit", command=self.quit )
25         self.quit.grid(row=0, column=0,
26                        sticky=tk.N+tk.S+tk.E+tk.W)
27         
28     def quit(self):
29         self.master.destroy()
30 
31 app = Application(tk.Tk())
32 app.master.title("grid自动改变大小的应用程序演示")
33 app.mainloop()

 

posted @ 2021-09-22 18:19  linbo.yang  阅读(328)  评论(0编辑  收藏  举报