文章目录
续上文: Python GUI:Tkinter——1
加入 Padding
所谓 Padding,就是棉片,哦不,空间的意思。通过控件的 .grid_configure
接口,可以设置控件在 x,y轴方向上的间隔。
大家可以接着Python GUI:Tkinter——1,在下面添加代码
aLabelFrame.grid_configure(padx=10,pady=40) #.grid_configure 接口可以设置 grid 排版格式
for child in aLabelFrame.winfo_children(): #遍历 Frame 下的所有控件
child.grid_configure(padx=8,pady=4)
效果如下,可以看到,aLabel 中的(子)控件的间隔变宽了,从而使得整个界面的排版变得小清新起来。
Frames within win
上一篇文章最后讨论了,若某个控件占用的长度过长,则会导致一整列都变长,进而导致界面排版混乱。如何解决呢?就是把控件的 Master,从 win 中改为某个 Frame。 注意,Frame 可以是 LabelFrame 也可以直接是 Frame。前者有一个 Label 作为“标题”,后者没有。
用 Frame 取代 win
用 Frame 取代 win 有什么作用呢?
- 便于遍历控制 Frame 中的所有控件
- 有利于改善 GUI 界面的整体视觉效果
大家可以接着Python GUI:Tkinter——1,在下面添加代码
"""在 win 下面加入下面的代码"""
bLabelFrame = ttk.LabelFrame(win,text='Python GUI')
bLabelFrame.grid(column=0,row=0)
把所有的控件的 Master 改为这个 Frame,即 bLabelFrame
这样做有什么好处呢?一是可以通过 .winfo_children() 来遍历 bLabelFrame 下面的控件,然后只要修改子控件就可以修改每个控件的间隔,比如:
for child in bLabelFrame.winfo_children():
child.grid_configure(sticky='W')
其中 sticky=‘W’ 等价于 tk.w,要记住,sticky 的英文是粘的意思,不是对其。所以,如果令 sticky='WSNE'
,则让控件占满整个空间。
改善 GUI 界面的整体视觉效果
如果某个控件占用了很多空间,那么与之同列的控件就会收到影响。因此,不能像上面那样,把所有控件放到一个Frame里。如果一个控件占用的空间太大,可以把他装到另一个 Frame 里,然后再把这个Frame 放入到 win 上。于是,就变成了 win 中有两个 Frames,每个 Frame 分配不同的空间。于是,某一个 Frame 的列宽度或列数,就不会影响另一个 Frame 的列宽度和列数。
添加 Menus
效果图:
实现代码
大家可以接着Python GUI:Tkinter——1,在下面添加代码。
from tkinter import Menu
menuBar = Menu(win) #示例话一个 Menu,Master 为 win。
"""思考一下,Master可以为 Frame 吗?评论区评论一下试试?"""
win.configure(menu=menuBar) #注意是 menu 参数
fileMenu = Menu(menuBar,tearoff=0) # tearoff 参数如果不设置,就会发现多出一条横线
"""提问: 你觉得这里的 menuBar 是父类,还是某个参数?在评论区回答一下吧/(ㄒoㄒ)/~~"""
fileMenu.add_command(label='New') #add_command 用来添加 menu 的“项”
"""嵌套"""
subFileMenu = Menu(fileMenu,tearoff=0) # 这个是 Menu 中的 Menu 了,可以一直这样嵌套下去
subFileMenu.add_command(label='Save')
subFileMenu.add_command(label='Save as')
fileMenu.add_cascade(label='Save as',menu=subFileMenu)
"""嵌套结束"""
fileMenu.add_separator() #给菜单“项”加一条横线
from sys import exit
def _quit(): #设置一个 menu 菜单项的激活函数
win.quit() #退出
win.destroy() #销毁
exit() #结束程序
fileMenu.add_command(label='Exit',command=_quit) #command参数设置激活函数,即退出。激活函数的定义同样要放在
#前面,这是因为 tk 控件是 callback 的缘故
menuBar.add_cascade(label='File',menu=fileMenu) #将fileMenu 添加进 menuBar,这样才会显示出来
helpMenu = Menu(menuBar,tearoff=0)
helpMenu.add_command(label='About')
menuBar.add_cascade(