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

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

最后

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

猜你也喜欢

发表评论

邮箱地址不会被公开。