Tkinter按钮部件的花样呈现|先生的Tkinter教程(2)
在上一篇文章《创建第一个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()
运行上述代码,我们创建的按钮在初始状态下是可点击的,当我们点击它之后,它的状态就变成了禁用状态了:
最后
文章代码地址已公布在知识星球,如有疑问,欢迎加入州的先生知识星球交流。