开篇
前两篇总结了python 可视化窗口组件tkinter的窗口创建以及标签(Label)组件的用法。希望能帮到正在学习tkinter的同学。有兴趣的同学可以先看前两篇文章:
逃学博士出品 - 为python插上翅膀,可视化接口工具tkinter的详解
tkinter教程 - Label组件,你想象不到的强大(附带实例)
很感谢@婚恋新观的问题:tk和ttk都有Label组件,使用时可以替换,到底有啥区别呢?
tk和ttk的区别,以Label组件为例
import tkinter as tk
import tkinter.ttk as ttk
window = tk.Tk()
s = ttk.Style()
s.configure("TLabel", padding=5, font=('微软雅黑', 20, 'bold'), relief=tk.GROOVE, backgroud='#008CBA')
LB_ttk = ttk.Label(window, text='逃学联盟', style='TLabel')
LB_tk = tk.Label(window, text='逃学部落')
LB_tk.config(font=('微软雅黑', 20, 'bold'))
LB_ttk.pack()
LB_tk.pack()
window.mainloop()
首先,我们创建两个标签,LB_tk和LB_ttk,通过keys()方法参看两个标签的所有参数;
LB_tk.keys():
['activebackground', 'activeforeground', 'anchor', 'background', 'bd', 'bg', 'bitmap', 'borderwidth',
'compound', 'cursor', 'disabledforeground', 'fg', 'font', 'foreground', 'height', 'highlightbackground',
'highlightcolor', 'highlightthickness', 'image', 'justify', 'padx', 'pady', 'relief', 'state', 'takefocus', 'text',
'textvariable', 'underline', 'width', 'wraplength']
LB_ttk.keys():
['background', 'foreground', 'font', 'borderwidth', 'relief', 'anchor', 'justify', 'wraplength', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'image', 'compound', 'padding', 'state', 'cursor', 'style', 'class']
以上粗体表示的是共同的参数,而没有的则是各自独有的。我们发现LB_ttk中多了style和class两个参数。而LB_tk中有而LB_ttk中没有的恰好是一些样式参数。
使用ttk中组件,就可以通过ttk.Style()去设置组件的样式,并且样式更加多元丰富。如上例中s.configure中设置了字体、间距、边框和背景色。具体怎么设置ttk.Style(),我们会在以后详细解答。
窗口控件配置方法(一):pack方法
看过前几篇文章的同学们应该知道,创建一个组件之后,需要将组件放入到窗口中,总共三种方法pack,grid和place。这一讲我们主要讲pack方法。
.pack(参数)
比较常用的参数有:side,fill,expand。
参数side
import tkinter as tk
import tkinter.ttk as ttk
window = tk.Tk()
window.minsize(400, 200)
window.resizable(True, True)
LB_1 = ttk.Label(window, text='标签_1', background='green')
LB_2 = ttk.Label(window, text='标签_2', background='red')
LB_3 = ttk.Label(window, text='标签_3', background='blue')
LB_1.pack()
LB_2.pack()
LB_3.pack()
window.mainloop()
如上例,我们创建三个标签,文字为标签_1, _2, _3,背景色为green,red和blue。使用pack(),内部参数为空,则统一使用默认值。我们发现,标签的排列方式是自上而下的,这是因为side的默认值是tk.TOP。side可以选择上下左右(TOP,BOTTOM,LEFT,RIGHT)。
这个很直接,也很容易理解。LEFT就是自左向右排列。
import tkinter as tk
import tkinter.ttk as ttk
window = tk.Tk()
window.minsize(400, 200)
window.resizable(True, True)
LB_1 = ttk.Label(window, text='标签_1', width=10, background='green')
LB_2 = ttk.Label(window, text='标签_2', width=10, background='red')
LB_3 = ttk.Label(window, text='标签_3', width=10, background='blue')
LB_1.pack(side=tk.LEFT, padx=10, pady=10)
LB_2.pack(side=tk.LEFT, padx=10, pady=10)
LB_3.pack(side=tk.LEFT, padx=10, pady=10)
window.mainloop()
为了美观,我们将标签的间距设置为10px,宽度也为10。添加side=tk.LEFT,就可以得到一字排开的三个标签。有兴趣的同学,可以自己设置BOTTOM和RIGHT来看看效果。
参数fill和expand
fill是填充的意思。上例中,我们的窗口大小是400 x 200, 标签的宽度为10, 高度为默认值,标签只占据很小的一块地方。通过设置fill参数,则可以让标签填满整个窗口。fill有三个值可选,tk.X, tk.Y和tk.BOTH。X, Y 代表填满X轴或者Y轴,BOTH代表X,Y轴都填满给定的组件空间。
expand是扩充,expand是填满上一级容器组件的额外空间。用法上区别于fill,通过例子讲解。
import tkinter as tk
import tkinter.ttk as ttk
window = tk.Tk()
window.minsize(400, 200)
window.resizable(True, True)
LB_1 = ttk.Label(window, text='标签_1', width=10, background='green')
LB_2 = ttk.Label(window, text='标签_2', width=10, background='red')
LB_3 = ttk.Label(window, text='标签_3', width=10, background='blue')
LB_1.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)
LB_2.pack(side=tk.LEFT, fill=tk.X, padx=10, pady=10)
LB_3.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10, pady=10)
window.mainloop()
这两个参数对初学者是很困扰的,两个好像都是填充的意思。我们一个一个来看:
- 创建的三个标签,宽度都为10,没有指定高度。
- pack中side指定为tk.LEFT,也就是说从左到右排列。那么,默认会怎么分配空间呢?如图3中,三个标签宽度为给定值10,高度为默认值。但是,side设置为LEFT排列。那么,分配给每个标签的空间是长为整个Y轴,宽为 标签宽度。
- 举一反三,如果side是tk.TOP。自上而下排列。那么,分配给每个标签的空间则为,宽为整个X轴,高为默认高度。
- 上下排列,则水平方向可自由填充;水平排列,则垂直方向可自由填充。
- fill=tk.Y,如图4的标签_1。那么,Y轴就会被填满。
- fill=tk.X,如图4的标签_2。那么,Y轴方向没设置,为标签默认高度;X轴设置了,但是标签分配到的空间在X轴上最大就是给宽度10。
通俗点,左右排列,标签的分配空间最大为图4中绿色部分。但是,蓝色区域在X轴上也被拉伸了,这是因为我们给标签_3设置了expand参数。
图3中,我们可以看到标签_3的右侧还有很大一块空间。这部分空间是窗口空间分配给三个标签之后的剩余空间,expand则是填充这部分剩余空间的。
总结来说是:fill填充组件的给定空间,expand填充组件外的剩余空间。
如果我们将窗口大小拖拽变大,蓝色将覆盖掉所有增大的XY轴方向的空间,因为设置了expand。而绿色面积只是单纯的填充Y轴上增加的空间,而红色面积不变。
总结
希望大家多多动手,查看案例。如果有不明白的地方,欢迎留言,我会尽力一一解答。
如果你喜欢这篇文章,请关注并转发。我们下期见!
本文暂时没有评论,来添加一个吧(●'◡'●)