在上一篇文章《创建第一个Tkinter图形界面|先生的Tkinter教程(1)》中,我们学习并创建了一个最基本的Tkinter图形界面程序。这个图形界面程序中只有一个简单的按钮部件,今天我们就继续来了解Tkinter的按钮部件。
一、最基础的按钮
在Tkinter中,按钮是通过实例化Button()类来创建的,然后通过其pack()方法,将按钮打包到按钮的父部件上。
# coding:utf-8
# 最基础的按钮
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.btn = tk.Button() # 实例化一个Button类
self.btn.pack() # 将按钮打包到按钮的父元素
if __name__ == '__main__':
app = ButtonApp()
app.mainloop()
运行上述代码,我们将会得到一个简陋的图形界面程序,如下图所示:
在上面的代码中,我们在实例化Button()类之后,又调用了它的pack()方法。pack()方法是一个小部件的通用方法,用于将实例化的小部件打包到其父部件中,如果不调用这个方法,实例化的小部件将不会显示。
# coding:utf-8
# 最基础的按钮 - 不调用pack()方法
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.btn = tk.Button() # 实例化一个Button类
# self.btn.pack() # 将按钮打包到按钮的父元素
if __name__ == '__main__':
app = ButtonApp()
app.mainloop()
运行上述代码,我们将只会看到一个空的窗口,按钮并不会出现在窗口中。
二、为按钮添加图片和文字
添加按钮文字
在创建了最基础的按钮之后,我们继续往按钮中添加一些东西。作为一个按钮,描述性的文字是必须要具备的,所以我们使用Button()类的text属性先为按钮添加文字:
# coding:utf-8
# 最基础的按钮
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.btn = tk.Button(# 实例化一个Button类
text='第一个按钮', # 设置按钮的文字
)
self.btn.pack() # 将按钮打包到按钮的父元素
if __name__ == '__main__':
app = ButtonApp()
app.mainloop()
运行上述代码,我们将会得到一个如下图所示的图形界面:
添加按钮图片
有时候,我们想让按钮更加地美观,于是在按钮的文字前加上一个小图片,这在Tkinter中借助于Button()类的image属性也是可以实现的。而在使用图片之前,我们需要实例化一个Tkinter的图像,这是通过PhotoImage()类来实现的,所以代码如下所示:
# coding:utf-8
# 为按钮添加文字和图片
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.image = tk.PhotoImage(file='z.png')
self.btn = tk.Button(# 实例化一个Button类
text='第一个按钮', # 设置按钮的文字
image = self.image, # 设置按钮图片
)
self.btn.pack() # 将按钮打包到按钮的父元素
if __name__ == '__main__':
app = ButtonApp()
app.mainloop()
如果运行上述代码,会发现,我们的按钮中只有一个图片,文字却消失了,如下图所示:
这是因为在按钮中,图片的优先级高于文字,默认情况下显示优先级最高的那个属性。如果需要两个属性都显示,那么我们还需要设置另一个属性——compound,这个复合属性用于将图像和文本组合在同一个按钮中,接受一个常量作为图像放置的位置:
# coding:utf-8
# 为按钮添加文字和图片
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.image = tk.PhotoImage(file='z.png')
self.btn = tk.Button(# 实例化一个Button类
text='第一个按钮', # 设置按钮的文字
image = self.image, # 设置按钮图片
compound = tk.LEFT, # 将图像放置在左侧
)
self.btn.pack() # 将按钮打包到按钮的父元素
if __name__ == '__main__':
app = ButtonApp()
app.mainloop()
现在运行上述代码,可以发现按钮中图像和文字都已经显示出来了。如下图所示:
而且图像位于按钮左侧,因为在这里,我们设置compound属性的值为tk.LEFT,此外,我们还能设置其值为CENTER、BOTTOM、RIGHT和TOP,分别表示图像放置在中央、底部、右侧和顶部。大家可以自行试一试。
三、控制按钮的排列
在前面的代码中,我们都通过pack()方法对按钮进行打包,除了直接进行调用,我们还能为pack()方法指定一些属性,用来控制按钮的位置和排列。pack()方法支持很多属性的设置,比如:
- before:在打包某一个小部件之前打包;
- expand:如果父级部件增大,也随之增大;
- fill:如果小部件增大则填充小部件;
- ipadx:在X轴方向上填充内边距;
- ipady:在Y轴方向上填充内边距;
- padx:在X轴方向填充;
- pady:在Y轴方向填充;
- side:在指定位置添加小部件;
下面我们就使用其中几个属性来设置一个新的按钮:
# coding:utf-8
# 控制按钮位置
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.wm_title('州的先生Tkinter教程')
self.image = tk.PhotoImage(file='z.png')
self.btn = tk.Button(# 实例化一个Button类
text='第一个按钮', # 设置按钮的文字
image = self.image, # 设置按钮图片
compound = tk.LEFT, # 将图像放置在左侧
)
self.btn.pack(# 将按钮打包到按钮的父元素
padx = 10,# 向X轴填充10个像素
pady = 50,# 向Y轴填充50个像素
expand = True, # 跟随父部件一起增大
fill = tk.BOTH, # 填充X轴和Y轴
)
if __name__ == '__main__':
app = ButtonApp()
app.mainloop()
运行上述代码,可以发现,窗口中的按钮在X轴方向有10个像素的外边距,在Y轴方向有50个像素的外边距,拖动窗口的大小,按钮的大小还会随之变化。如下图所示:
四、设置按钮的浮雕样式
上面我们创建的按钮都是一个形态的,其实在Tkinter中默认可以对按钮设置各种浮雕的样式。其通过Button()类的relief属性来实现,具体看代码:
# coding:utf-8
# tkinter - 按钮的浮雕样式
import tkinter as tk
# 按钮的浮雕类型
btn_type = [
{'name':'下沉','relief':tk.SUNKEN},
{'name':'突出','relief':tk.RAISED},
{'name':'沟槽','relief':tk.GROOVE},
{'name': '平的(无边框)', 'relief':tk.FLAT},
{'name': '实线', 'relief':tk.SOLID}
]
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.img = tk.PhotoImage(file='z.png')
self.btns = [self.create_btn(r) for r in btn_type]
for btn in self.btns:
btn.pack(padx=10, # 向X轴方向填充10的像素(按钮左右之间的间隔)
pady=20, # 向Y轴方向填充10个像素(按钮上下之间的间隔)
side=tk.LEFT, # 向右进行排列
)
# 动态创建按钮
def create_btn(self,btn_type):
return tk.Button(
text=btn_type['name'],
image=self.img,
compound = tk.LEFT,
relief=btn_type['relief']) # 指定按钮的浮雕样式
if __name__ == '__main__':
ui = ButtonApp()
ui.mainloop()
运行代码,可以发现窗口中的5个按钮的样式各不一样,这都是依靠relief属性指定浮雕的样式实现的。如下图所示:
五、绑定函数和禁用按钮
作为按钮最常用的功能,怎么能少了对按钮绑定一个函数,以及禁用按钮呢。在上一篇文章中,我们就通过Button()类的command属性选项,使用了按钮的绑定函数功能,点击按钮时将文本打印到控制台。
同时,Button的启用和禁用状态,都是通过其state属性选项来控制的。如果我们在实例化Button()类的时候就指定其state属性选项为tk.tk.DISABLED,那么显示出来的按钮就是禁用状态的:
# coding:utf-8
# tkinter - 按钮绑定函数和禁用
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.wm_title('州的先生Tkinter教程')
self.img = tk.PhotoImage(file='z.png')
self.btn = tk.Button(
text='第一个按钮', # 设置按钮文本
image = self.img,
compound = tk.LEFT, # 按钮复合部件的排列方向
command=self.disable_btn, # 按钮绑定的命令
state=tk.DISABLED # 按钮禁用
)
self.btn.pack() # 初始化按钮图形
if __name__ == '__main__':
ui = ButtonApp()
ui.mainloop()
运行上述代码,得到一个被禁用的按钮:
如果我们需要通过命令来动态禁用按钮,那么就需要从Button()的config()方法中进行配置,所以完整的代码如下所示:
# coding:utf-8
# tkinter - 按钮绑定函数和禁用
import tkinter as tk
class ButtonApp(tk.Tk):
def __init__(self):
super().__init__()
self.wm_title('州的先生Tkinter教程')
self.img = tk.PhotoImage(file='z.png')
self.btn = tk.Button(
text='第一个按钮', # 设置按钮文本
image = self.img,
compound = tk.LEFT, # 按钮复合部件的排列方向
command=self.disable_btn, # 按钮绑定的命令
)
self.btn.pack() # 初始化按钮图形
# 禁用按钮
def disable_btn(self):
self.btn.config(state=tk.DISABLED)
if __name__ == '__main__':
ui = ButtonApp()
ui.mainloop()
运行上述代码,我们创建的按钮在初始状态下是可点击的,当我们点击它之后,它的状态就变成了禁用状态了:
最后
文章代码地址已公布在知识星球,如有疑问,欢迎加入州的先生知识星球交流。
文章版权所有:州的先生博客,转载必须保留出处及原文链接