实例讲解Tkinter数值与文本选择小部件|先生的Tkinter教程(4)

一、前言

在图形界面开发中,除了按钮和文本输入框外,各种选择框也是必不可少的组件。为了确保用户输入的准确性,很多内容我们不方便让用户自行输入,转而使用各种预置好内容的选择框供用户使用。下面,我们就实例讲解一下Tkinter中各种选择框小部件的使用。

二、数值选择框

很多时候,我们需要用户输入一个数值,为了避免用户输入了其他的字符,增添额外的验证,我们最好选择数值选择框小部件来限制用户输入数值。

在Tkinter中,有两个小部件可以提供数值选择功能:

  • Spinbox()
  • Scale()

这两个小部件功能是一样的,但是在配置和前端显示上有些许差异,下面我们分别来看看。

Spinbox

首先,我们来看看Spinbox小部件。Spinbox小部件的可配置参数很多,但是用在数值选择的配置也就两三个,其可以通过from_参数指定最小值,通过to参数指定最大值来设置选值范围:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter数值选择小部件

import tkinter as tk

class SelectApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.select_num_1 = tk.Spinbox(from_=0,to=9,validate=int)
        self.select_num_1.pack()

if __name__ == '__main__':
    app = SelectApp()
    app.mainloop()

上述代码中,我们就实例化了一个Spinbox()小部件,并通过from_、to参数指定了其选值范围为0到9。运行上述代码,我们会得到如下图所示的图形界面窗口:

除了from_和to参数,我们还可以通过value参数指定一个列表作为Spinbox选值框的选值范围:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter数值选择小部件

import tkinter as tk

class SelectApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.select_num_1 = tk.Spinbox(value=[1,3,5,7,9])
        self.select_num_1.pack()

if __name__ == '__main__':
    app = SelectApp()
    app.mainloop()

其效果是一样的,但是选值范围就只有列表中的值了,如下图所示:

Scale

接下来我们来看看Scale()小部件。Scale()是另一个显示形式的选值小部件,在默认不带任何参数的情况下,它的选值范围为0到100,小部件的对齐方式为水平对齐:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter数值选择小部件

import tkinter as tk

class SelectApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程')
        self.select_num_2 = tk.Scale()
        self.select_num_2.pack()

if __name__ == '__main__':
    app = SelectApp()
    app.mainloop()

运行上述代码,我们将会得到一个如下图所示的选值框窗口:

可以看到,图中生成的选值小部件是一个滚动条,而且这个滚动条是竖着排放的。下面我们设置Scale的对齐方式为垂直,并指定它的选值范围:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter数值选择小部件

import tkinter as tk

class SelectApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程')
        self.select_num_2 = tk.Scale(from_=1,to=8,orient=tk.HORIZONTAL)
        self.select_num_2.pack()

if __name__ == '__main__':
    app = SelectApp()
    app.mainloop()

在这里,我们通过orient参数指定了小部件的对齐方式为tk.HORIZONTAL,然后通过from_、to参数指定了小部件的选值范围,运行代码我们会得到如下图所示的图像界面窗口:

三、单选框

上面介绍了选值框小部件的两种不同的形式,现在我们继续来看单选框。单选框在表单中可以说是特别常见了。在Tkinter中,单选框通过实例化RadioButton()类来创建。RadioButton()有很多的参数可以使用,但是在这里,我们暂时只需要关注3个参数:

  • text:单选框的显示文本;
  • value:单选框的值;
  • variable:单选框的变量值,在RadioButton中,当value的值等于variable的值的时候,表示单选框被选中,可以使用这个参数来标识单选框的分组。

下面我们来看一看实际的例子:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter单选小部件

import tkinter as tk

class RadioApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程')
        self.radio_var = tk.StringVar() # 实例化一个TK字符串变量
        self.radio_var.set("女") # 设置TK字符串变量的值
        self.radio_btn_1 = tk.Radiobutton(text='男',value='男',variable=self.radio_var)
        self.radio_btn_2 = tk.Radiobutton(text='女',value='女',variable=self.radio_var)
        self.radio_btn_3 = tk.Radiobutton(text='保密',value='保密',variable=self.radio_var)
        self.radio_btn_4 = tk.Radiobutton(text='a',value='a')

        self.radio_btn_1.pack()
        self.radio_btn_2.pack()
        self.radio_btn_3.pack()
        self.radio_btn_4.pack()

if __name__ == '__main__':
    app = RadioApp()
    app.mainloop()

在此我们实例化了一个tk的StringVar()变量类来作为前3的单选框variable的值,其用法我们后面会具体介绍。运行上述代码我们会得到如下图所示的图像界面窗口:

可以看到,【男、女、保密】三个单选框的variable值是一样的,它们之间就永远只有一个可以被选中,而【a】单选框就没有这个限制。

四、多选框

多选框主要用于一个或多个选择项的使用,在Tkinter中,我们可以通过Checkbutton小部件来实现多选框。

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter数值选择小部件

import tkinter as tk

class CheckApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程')
        self.cb = tk.Checkbutton(text='Python')
        self.cb.pack()

if __name__ == '__main__':
    app = CheckApp()
    app.mainloop()

运行上述代码,我们会得到一个多选框的图像界面窗口,如下图所示:

这样我们虽然创建了一个多选框也能够选中和取消,但是我们的程序并不知道我们的操作之后,选项框的状态是什么,我们可以像单选框一样,通过设置variable参数来实现,同时可以指定多选框的选中值和未选中值:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter数值选择小部件

import tkinter as tk

class CheckApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程')
        self.str = tk.StringVar()
        self.str.set('Other')
        self.cb_1 = tk.Checkbutton(text='Python',command=self.get_value,variable=self.str,onvalue='Python',offvalue='Other')
        self.cb_1.pack()

    def get_value(self):
        value = self.str.get()
        print(value)

if __name__ == '__main__':
    app = CheckApp()
    app.mainloop()

在这里,我们像之前使用单选框一样实例化了一个tk的StringVar对象,然后在CheckButton对象中设置offvalue参数来指定未选中时的值,设置onvalue参数来指定选中时的值,运行上述代码,我们会得到如下图所示的图形界面窗口:

五、列表选择框

除了上述介绍的几种小部件,我们经常使用到的还有列表小部件,列表小部件用于从一个列表中选择项,其可以只选择一个或者是多选,在使用上可以说比较灵活。

在Tkinter中,列表选择框通过Listbox()对象来实现:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter列表框小部件

import tkinter as tk

class ListApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程') # 设置窗口标题
        self.list_box = tk.Listbox() # 创建一个列表选择框
        # 向列表选择框中插入列表项
        for i,p in enumerate(['数据采集','数据分析','Web开发','图形界面开发']):
            self.list_box.insert(i,p)
        self.btn = tk.Button(text='检查',command=self.get_select) # 创建一个按钮
        self.list_box.pack() 
        self.btn.pack()

    # 获取列表框的当前选择项
    def get_select(self):
        print(self.list_box.curselection())


if __name__ == '__main__':
    app = ListApp()
    app.mainloop()

在上述代码中,我们通过实例化Listbox()对象创建了一个列表选择框,然后通过它的insert()方法,在列表选择框中插入了几个列表选择项,接着创建了一个按钮,并创建了一个方法连接到了按钮上用来获取列表选择框中选中的列表项。运行上述代码,我们会得到如下图所示的图形界面窗口:

默认情况下,列表选择项是单选模式,也就是说只能选择一个选择项,所以在上图中我们只能点选一个选项。我们还可以通过selectmode设置其他的选择模式:

  • SINGLE:单选模式;
  • BROWSE:通过上下键进行单选;
  • MULTIPLE:多选模式;
  • EXTENDED:通过SHIFT和CTRL键选择范围的多选模式;

在日常开发使用中,单选和多选模式还是最常用的,下面我们再介绍一下多选模式的使用:

# coding:utf-8
# 州的先生 - http://zmister.com
# Python编程应用实战
# Tkinter列表框小部件

import tkinter as tk

class ListApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_title('州的先生Tkinter教程') # 设置窗口标题
        self.list_box = tk.Listbox(selectmode=tk.MULTIPLE) # 创建一个列表选择框,设置选择模式为多选
        # 向列表选择框中插入列表项
        for i,p in enumerate(['数据采集','数据分析','Web开发','图形界面开发']):
            self.list_box.insert(i,p)
        self.btn = tk.Button(text='检查',command=self.get_select) # 创建一个按钮
        self.list_box.pack()
        self.btn.pack()

    # 获取列表框的当前选择项
    def get_select(self):
        print(self.list_box.curselection())


if __name__ == '__main__':
    app = ListApp()
    app.mainloop()

运行上述代码,我们可以发现列表框中的列表项可以多选了,而且获取到的当前选中值也是多个的,详情如下图所示:

六、最后

上面我们介绍了几种常见的数值和文本选择小部件,在图形界面开发中这些小部件都用于获取用户输入的值,是最基础的交互部件的。文中代码已经上传至资源中心,下载地址详见博客置顶文章:http://zmister.com/archives/692.html

猜你也喜欢

发表评论

电子邮件地址不会被公开。