Python基础入门学习笔记 076 GUI的终极选择:Tkinter13

发布时间 2023-08-23 14:16:03作者: 一杯清酒邀明月

布局管理器

布局管理器就是管理你的那些组件如何排列的家伙。Tkinter有三个布局管理器,分别是pack、grid和place

pack:按添加顺序排列组件

grid:按行/列形式排列组件

place:允许程序员指定组件的大小和位置

pack

实例1:生成一个Listbox组件并将它填充到root窗口

 1 from tkinter import *
 2 
 3 root = Tk()
 4 listbox = Listbox(root)
 5 #fill选项是告诉窗口管理器该组件将怎样填充整个分配给它的空间
 6 #BOTH表示同时横向和纵向扩展;X表示横向;Y表示纵向
 7 #expand选项是告诉窗口管理器是否将父组件的额外空间也填满(任意拉伸窗口依旧会填满)
 8 
 9 #默认情况下pack是将添加的组件依次纵向排列
10 listbox.pack(fill=BOTH,expand=True)
11 for i in range(10):
12     listbox.insert(END,str(i))
13 
14 mainloop()

 实例2:纵向排列,横向填充

 1 from tkinter import *
 2 
 3 root = Tk()
 4 #fill选项是告诉窗口管理器该组件将怎样填充整个分配给它的空间
 5 #BOTH表示同时横向和纵向扩展;X表示横向;Y表示纵向
 6 #expand选项是告诉窗口管理器是否将父组件的额外空间也填满
 7 
 8 #默认情况下pack的side属性是将添加的组件依次纵向排列
 9 Label(root, text="red", bg="red", fg="white").pack(fill=X)
10 Label(root, text="green", bg="green", fg="black").pack(fill=X)
11 Label(root, text="blue", bg="blue", fg="white").pack(fill=X)
12 
13 mainloop()

 实例3:横向排列,纵向填充

 1 from tkinter import *
 2 
 3 root = Tk()
 4 #fill选项是告诉窗口管理器该组件将怎样填充整个分配给它的空间
 5 #BOTH表示同时横向和纵向扩展;X表示横向;Y表示纵向
 6 #expand选项是告诉窗口管理器是否将父组件的额外空间也填满
 7 
 8 #将pack设置为横向排列
 9 Label(root, text="red", bg="red", fg="white").pack(side=LEFT)
10 Label(root, text="green", bg="green", fg="black").pack(side=LEFT)
11 Label(root, text="blue", bg="blue", fg="white").pack(side=LEFT)
12 
13 mainloop()

grid

使用一个grid就可以简单地实现你用很多个框架和pack搭建起来的效果。使用grid排列组件,只需告诉它你想要将组件放置的位置(行row/列column)。

实例1:

 1 from tkinter import *
 2 
 3 root = Tk()
 4 
 5 #column默认值是0
 6 #默认情况下组件会居中显示在对应的网格里
 7 #Label(root,text="用户名").grid(row=0)
 8 #Label(root,text="密码").grid(row=1)
 9 #设置sticky=W使Label左对齐
10 Label(root,text="用户名").grid(row=0,sticky=W)#左对齐
11 Label(root,text="密码").grid(row=1,sticky=W)
12 
13 Entry(root).grid(row=0,column=1)
14 Entry(root,show="*").grid(row=1,column=1)
15 
16 mainloop()

 实例2:设置rowspan与columnspan实现跨行和跨列功能

 1 from tkinter import *
 2 
 3 root = Tk()
 4 
 5 #column默认值是0
 6 #默认情况下组件会居中显示在对应的网格里
 7 #Label(root,text="用户名").grid(row=0)
 8 #Label(root,text="密码").grid(row=1)
 9 #设置sticky=W使Label左对齐
10 #创建Label文本
11 Label(root,text="用户名").grid(row=0,sticky=W)
12 Label(root,text="密码").grid(row=1,sticky=W)
13 #创建输入
14 Entry(root).grid(row=0,column=1)
15 Entry(root,show="*").grid(row=1,column=1)
16 #插入Label图像
17 photo = PhotoImage(file="logo.gif")
18 #rowspan=2跨两行,边距5
19 Label(root,image=photo).grid(row=0,column=2,rowspan=2,padx=5,pady=5)
20 #columnspan=3跨三列(默认为居中显示),边距5
21 Button(text="提交",width=10).grid(row=2,columnspan=3,pady=5)
22 
23 mainloop()

place

通常情况下不建议使用place布局管理器

实例1:将子组件显示在父组件的正中间

 1 from tkinter import *
 2 
 3 def callback():
 4     print("正中靶心")
 5 root = Tk()
 6 #relx和rely指定的是子组件相对于父组件的位置,范围是(00`1.0),0.5则表示一半,正中间
 7 #anchor=CENTER表示正中显示
 8 Button(root,text="点我",command=callback).place(relx=0.5,rely=0.5,anchor=CENTER)
 9 
10 mainloop()

 实例2:Button组件覆盖Label组件

 1 from tkinter import *
 2 
 3 def callback():
 4     print("正中靶心")
 5 root = Tk()
 6 
 7 photo = PhotoImage(file="logo_big.gif")
 8 Label(root,image=photo).pack()
 9 #relx和rely指定的是子组件相对于父组件的位置,范围是(00`1.0),0.5则表示一半,正中间
10 Button(root,text="点我",command=callback).place(relx=0.5,rely=0.5,anchor=CENTER)
11 
12 mainloop()

 实例3:

 1 from tkinter import *
 2 
 3 root = Tk()
 4 
 5 #relx和rely指定的是子组件相对于父组件的位置,范围是(00`1.0),0.5则表示一半,正中间
 6 #relwidth和relheight选项指定相对父组件的尺寸
 7 Label(root,bg="red").place(relx=0.5,rely=0.5,relheight=0.75,relwidth=0.75,anchor=CENTER)
 8 Label(root,bg="yellow").place(relx=0.5,rely=0.5,relheight=0.5,relwidth=0.5,anchor=CENTER)
 9 Label(root,bg="green").place(relx=0.5,rely=0.5,relheight=0.25,relwidth=0.25,anchor=CENTER)
10 
11 mainloop()