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()  

运行上述代码,我们创建的按钮在初始状态下是可点击的,当我们点击它之后,它的状态就变成了禁用状态了:

最后

文章代码地址已公布在知识星球,如有疑问,欢迎加入州的先生知识星球交流。