控件

控件是用图形表示的具备特定功能的界面元素。使用控件,可以象搭积木一样很方便地创建程序界面。它是代码重用的一种方式。常用的控件有标签、文本框、命令按钮、列表框、单选钮、核选框、旋转按钮、组合框、滚动条等。

创建控件的方法

创建控件,Excel VBA中可以使用设计时和运行时两种方法,Python Tkinter中则只能在运行时通过特定函数进行创建。

【Excel VBA】

code.vba
Excel VBA中创建控件,也有设计时和运行时两种方式。

设计时创建控件,首先在工具箱中单击要创建的控件的图标按钮,然后在窗体上合适的位置单击鼠标左键并拖拉鼠标,再在合适的位置停下来单击鼠标左键,目标控件就创建好了。所以这是一个“所见即所得”的过程,操作很方便直观。

运行时创建控件需要用到Controls集合对象的Add方法。窗体对象的Controls属性返回Controls集合,该集合中存储窗体中的所有控件并进行管理。Add方法具有类似下面的形式:

code.vba
  Set lblT = UserForm1.Controls.Add("forms.ctlType.1", ctlName, True)

其中,lblT是一个Object对象,UserForm1是一个窗体对象,"forms.ctlType.1"指定控件类型,ctlName为控件名称。

在Excel VBA编程环境中添加一个窗体后,双击窗体进入代码窗口,添加下面的事件过程,在激活窗体事件触发时在窗体上添加一个标签,标签文本为“新标签”。

code.vba
Private Sub UserForm_Activate()
  Dim lblT As Object
  Set lblT = UserForm1.Controls.Add("forms.label.1", Label1, True)
  lblT.Caption = "大谦Excel"
End Sub

【Python】

Python Tkinter中,使用特定的函数创建控件。例如,在Python Shell窗口输入下面的代码,创建窗体后,用Button函数创建一个文本为“确定”,宽度为8,背景色为黄色的命令按钮。用pack方法将命令按钮停放在距离窗体顶部10个单位的位置。

code.python
>>> from tkinter import *
>>> form=Tk()
>>> form.geometry('400x160+100+100')

#创建按钮,文本为“确定”,宽度为8,背景色为黄色

code.python
>>> btn=Button(form,text='确定',width=8,background='yellow')
>>> btn.pack(pady=10)  #布局,距离顶部10个单位

控件的共有属性

有些属性是绝大部分控件所共有的,有必要将它们单独列出来进行介绍。这些属性与控件的位置、大小、颜色、字体、边框、样式、图片等有关。

【Excel VBA】

Excel VBA中控件共有的属性包括:

Left和Top属性 控件左上角在窗体坐标系中的横坐标和纵坐标。

Width和Height属性 控件的宽度和高度。

BackColor和ForeColor属性 控件的背景色和前景色。

Font属性 设置字体。

BorderColor和BorderStyle属性 设置控件边框的颜色和样式等。

Picture属性 设置控件上的图片。

Visible属性 设置控件的可见性。

这些属性的设置可有设计时和运行时两种方式,请参见2.1.2小节窗体属性的设置方法。

重点介绍一下控件颜色和字体的设置方法。

设置控件的颜色可以用颜色常数、整数、十六进制数和RGB函数等进行设置,例如下面的代码在运行时如果发生单击命令按钮的事件,命令按钮的背景色改为红色。

code.vba
Private Sub CommandButton1_Click()
  CommandButton1.BackColor = vbRed  '用颜色常数设置
  'CommandButton1.BackColor = 255  '用整数设置
  'CommandButton1.BackColor = &HFF&  '用十六进制数设置
  'CommandButton1.BackColor = RGB(255,0,0)  '用RGB函数设置
End Sub

设置控件文本的字体,使用控件对象的Font属性返回一个Font对象,利用该对象的属性设置字体。例如,下面的代码在运行时如果发生单击命令按钮的事件,命令按钮的标题改变字体。

code.vba
Private Sub CommandButton1_Click()
  With CommandButton1.Font
    .Name = "宋体"  '设置字体名称
    .Size = 16  '设置字体大小
    .Bold = True  '设置是否加粗
    .Italic = True   '设置是否倾斜
    .Underline = True   '设置是否加下划线
    .Strikethrough = True   '设置是否加删除线
  End With
End Sub

【Python】

Python Tkinter中控件共有的属性包括:

width和height属性 设置控件的宽度和高度。控件的位置跟布局有关,参见下一小节。

background, foreground属性 设置控件的背景色和前景色。

font属性 设置字体。

borderwidth属性 设置控件的边框宽度。

padx和pady属性 设置控件中文字与边界的距离。

relief属性 设置控件的外观样式。

image属性 设置图片。

command属性 设置关联的事件响应。

属性的设置方法参见2.1.2小节窗体属性的设置。

Python Tkinter中控件的颜色可以用常数或十六进制整数进行设置,例如:

code.python
>>> btn=Button(form,text='确定',width=8)
>>> btn['background']='red'

code.python
>>> btn['background']='#FF0000'

常用的颜色常数包括:red(红色), green(绿色), blue(兰色), yellow(黄色), orange(橙色), lightgreen(淡绿色), lightblue(淡蓝色), lightyellow(淡黄色)等。

控件中文字的字体用font属性进行设置,例如下面设置命令按钮上标题文本的字体为宋体,字体大小为15,加粗、倾斜、添加下划线和删除线。

code.python
>>> btn['font']=('宋体',15, 'bold', 'italic', 'underline', 'overstrike')

控件的样式用relief属性设置,例如下面将命令按钮的样式设置为凸起。

code.python
>>> btn['releif']='raised'

可设置的样式包括:flat(平整), raised(凸起), sunken(下凹), groove(边凹), ridge(边凸), solid(黑框)等。

控件的布局

控件的布局指的是合理布置窗体中控件的位置,达成理想的界面外观效果。

【Excel VBA】

Excel VBA中,设计时创建控件因为采用的是所见即所得的方式,所以可以交互式地控制控件的布局。另外,“格式”菜单中提供了很多布局有关的工具可以使用,如控件对齐工具、尺寸统一工具、间隔排列工具等。

运行时创建控件可以使用控件的Left和Top属性控制控件的位置,用Width和Height属性控制控件的大小。

【Python】

Python Tkinter有3种布局方法,即place布局、Pack布局和Grid布局。

place布局跟Excel VBA中控件的布局方法类似,可以精确地指定控件的位置和大小。用控件对象的place方法实现place布局,该方法的主要参数有:

x和y:指定控件左上角的x坐标和y坐标。

width和height:指定控件的宽度和高度。

relx和rely:指定控件相对于窗体的x坐标和y坐标,值为0-1之间的小数。

relwidth和relheight:指定控件相对于窗体的宽度和高度,值为0-1之间的小数。

Pack布局通过控件在窗体某一侧停靠分割窗体空间来进行布局。使用控件对象的pack方法实现Pack布局,该方法的主要参数有:

anchor:指定控件的对齐方式,值取N(顶对齐)、S(底对齐)、W(左对齐)和E(右对齐)等。

side:指定控件在窗体中的停靠位置,值可为'top', 'bottom', 'left'和'right'等,默认时时顶部停靠,中心对齐。

fill:指定填充方式,值为X(水平填充)或Y(垂直填充)。

expand:是否可以扩展,值为1(可扩展)或0(不可扩展)。

Grid布局采用均匀网格结构进行布局。使用控件对象的grid方法实现网格布局,该方法的主要参数有:

row:指定行编号,基数为0。

column:指定列编号,基数为0。

rowspan:指定行合并,控件占据多行。

columnspan:指定列合并,控件占据多列。

sticky:指定控件的对齐方式,值取N(顶对齐)、S(底对齐)、W(左对齐)和E(右对齐)等。

Pack布局和Grid布局还有几个常用的参数:

padx和pady:指定控件外部与左右或上下的距离,比如指定pady=10,表示控件与上下的距离为10,pady=(10,0)表示控件与上面的距离为10,与下面没有距离。

ipadx和ipady:指定控件内部文本与控件左右两侧或上下两边的距离,是控件内部的距离度量。

标签控件

标签控件用于在界面上显示不可交互操作和不可修改的文本内容。

【Excel VBA】

设计时创建标签控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制标签。选择它,在属性窗

设计时创建标签控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制标签。选择它,在属性窗口中设置标签的属性。常见属性的设置请参见2.2.2小节。用Caption属性设置标签的文本。

运行时动态创建标签控件,使用Controls集合的Add方法。下面的代码创建一个指定位置和大小,背景色为黄色,文本为“标签示例”的标签。示例文件的存放路径为Samples\ch14\Excel VBA\标签.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim lblNew As Object
  Set lblNew = Me.Controls.Add("forms.label.1", "Label1", True)  '创建标签
  With lblNew  '设置标签
    .Left = 10:.Top = 10  '位置
    .Width = 100:.Height = 20  '大小
    .BackColor = RGB(255, 255, 0)  '背景色为黄色
    .Caption = "标签示例"  '文本
  End With
End Sub

【Python】

Python Tkinter中用Label函数创建标签控件。标签控件的常用属性请参见2.2.2小节内容。用text属性设置或返回标签的文本。

下面创建3个标签,第个标签的背景色为淡绿色,第2个标签的样式为凸起,前景色为红色,设置了字体。第3个标签的文本有换行。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\标签.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('300x120+100+100')
#第1个标签
lbl1=Label(form,text='这是一个标签')
lbl1.pack()
lbl1['background']=7;lightgreen'  #背景色为淡绿色
#第2个标签
lbl2=Label(form,text='这是第二个标签')
lbl2.pack()
lbl2['relief']='raised'  #样式为凸起
lbl2['foreground';]='red'  #前景色为红色
#设置字体:黑体,大小为15,加粗,倾斜,下划线
lbl2['font']=('黑体',15,'bold','italic','underline')
#第3个标签
lbl3=Label(form,text='这是第三个标签这是第三个标签')
lbl3.pack()
lbl3['wraplength']=120  #换行长度为120
lbl3['background']='lightblue'  #背景色为淡蓝色
lbl3['width']=20  #宽度为20
lbl3['height']=3  #高度为3
form.mainloop()

运行脚本,效果如图2-3所示。

Document Image

图2-3 创建标签控件

文本框控件

使用文本框控件可以在界面上交互输入和显示文本内容。

【Excel VBA】

设计时创建文本框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制文本框。选择它,在属

设计时创建文本框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制文本框。选择它,在属性窗口中设置文本框的属性。常见属性的设置请参见2.2.2小节。用Text属性设置文本框中的文本。

运行时动态创建文本框控件,使用Controls集合的Add方法。下面的代码创建一个指定位置和大小,背景色为黄色,文本为“文本框示例”的文本框。示例文件的存放路径为Samples\ch14\Excel VBA\文本框.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim txtNew As Object
  Set txtNew = Me.Controls.Add("forms.textbox.1", "TextBox1", True)
  With txtNew
    .Left = 10: .Top = 10
    .Width = 100: .Height = 20
    .BackColor = RGB(255, 255, 0)
    .Text = "文本框示例"
  End With
End Sub

【Python】

Python Tkinter中用Entry函数创建单行文本框控件。单行文本框控件的常用属性请参见2.2.2小节内容。用insert方法可以在单行文本框的指定位置插入文本。

下面创建3个单行文本框,第1个单行文本框设置了被选择文本的背景色和前景色,选择前两个字符查看效果;第2个单行文本框插入文本后,在第2个字符前插入新文本;第3个单行文本框将输入的字符全部显示为星号。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\单行文本框.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('400x160+100+100')
#第1个单行文本框
en1=Entry(form)
en1.pack()
en1.insert('end','单行文本框')  #末尾插入文本
en1['selectbackground']='lightblue'  #被选择文本的背景色淡蓝色
en1['selectforeground';]='red'  #被选择文本的前景色红色
en1.focus_set()  #焦点转移到文本框
en1.select_range(0,2)  #选择前2个字符
#第2个单行文本框
en2=Entry(form)
en2.pack()
en2.insert('end','单行文本框')  #末尾插入文本
en2.icursor(1)  #光标插到第2个字符前
en2.insert('insert','单行文本框')  #光标处插入文本
#第3个单行文本框
en3=Entry(form)
en3.pack()
en3.insert('end','单行文本框')  #末尾插入文本
en3['show']='*'  #输入的字符显示为星号
form.mainloop()

运行脚本,效果如图2-4所示。

Document Image

图2-4 创建单行文本框控件

Python Tkinter中用Text函数创建多行文本框控件。多行文本框控件的常用属性请参见2.2.2小节内容。用insert方法可以在多行文本框的指定位置插入文本。

下面创建3个多行文本框,第1个多行文本框设置了被选择文本的背景色和前景色;第2个和第3个多行文本框插入文本后,用两种方式实现在第3个字符前插入新文本。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\多行文本框.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('400x200+100+100')
#第1个多行文本框
txt1=Text(form,width=50,height=3)
txt1.pack()
txt1.insert('end','多行文本框多行文本框多行文本框多行文本框多行文本框多行文本框多行文本框多行文本框')  #末尾插入文本
txt1['selectbackground']='lightblue'  #被选择文本的背景色淡蓝色
txt1['selectforeground';]='red'  #被选择文本的前景色红色
print(txt1.get('1.67;,END))  #get获取文本内容
#第2个多行文本框
txt2=Text(form,width=50,height=3)
txt2.pack()
txt2.insert('end','多行文本框')  #末尾插入文本
txt2.mark_set('pos';,'1.2')  #标记位置为第3个字符前
txt2.insert('pos','插入内容')  #在标记处插入文本
#第3个多行文本框
txt3=Text(form,width=50,height=3)
txt3.pack()
txt3.insert('end','多行文本框')  #末尾插入文本
txt3.insert('1.2','插入内容')  #在第1行第3个字符前插入文本
form.mainloop()

运行脚本,效果如图2-5所示。

Document Image

图2-5 创建多行文本框

命令按钮控件

命令按钮可用于发出指令。

【Excel VBA】

设计时创建命令按钮控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制命令按钮。选择它,

设计时创建命令按钮控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制命令按钮。选择它,在属性窗口中设置命令按钮的属性。常见属性的设置请参见2.2.2小节。用Caption属性设置命令按钮的标题。

运行时动态创建命令按钮控件,使用Controls集合的Add方法。下面的代码创建一个指定位置和大小,背景色为黄色,文本为“命令按钮示例”的标签。示例文件的存放路径为Samples\ch14\Excel VBA\命令按钮.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim cmdNew As Object
  Set cmdNew = Me.Controls.Add("forms.commandbutton.1", "Button1", True)
  With cmdNew
    .Left = 10: .Top = 10
    .Width = 100: .Height = 20
    .BackColor = RGB(255, 255, 0)
    .Caption = "命令按钮示例"
  End With
End Sub

常常使用命令按钮控件的Click事件发布指令。例如,下面的代码定义程序运行时单击命令按钮,将窗体的标题修改为“命令按钮单击事件测试”。 示例文件的存放路径为Samples\ch14\Excel VBA\命令按钮2.xlsm。

code.vba
Private Sub CommandButton1_Click()
  Me.Caption = "命令按钮单击事件测试"
End Sub

【Python】

Python Tkinter中用Button函数创建命令按钮控件。命令按钮控件的常用属性请参见2.2.2小节内容。用text属性设置命令按钮的标题,用command属性定义单击命令按钮时的响应,用函数定义响应。

下面创建3个命令按钮,第1个命令按钮背景色为淡绿色,单击它时调用callback函数,输出“已确定”字符串;第2个命令按钮背景色为淡兰色,单击它时调用callback2函数,该函数带参数;单击第3个命令按钮时调用窗体对象的destroy方法,退出。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\命令按钮.py。

code.python
from tkinter import *
def callback():
    print('已确定')
def callback2(para):
    print(para)
#窗体
form=Tk()
form.geometry('400x160+100+100')
#第1个按钮
btn1=Button(form,text='确定',width=8,command=callback)
btn1.pack(pady=10)
btn1['background']=7;lightgreen'  #背景色为淡绿色
#第2个按钮
btn2=Button(form,text='参数确定',width=8,command=lambda:callback2('参数确定'))
btn2.pack(pady=10)
btn2['background']='lightblue'  #背景色为淡兰色
#第3个按钮
btn3=Button(form,text='退出',width=8,command=form.destroy)
btn3.pack(pady=10)
form.mainloop()

运行脚本,效果如图2-6所示。

Document Image

图2-6 创建命令按钮

单击第1个和第2个按钮,在Python Shell窗口输出下面的内容。

code.python
>>> = RESTART: …\Samples\ch64-界面\Python\命令按钮.py
已确定
参数确定

单击第3个按钮,关闭界面,退出。

单选钮控件

可用一组单选钮控件实现单项选择。

【Excel VBA】

设计时创建单选钮控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制单选钮。选择它,在属

设计时创建单选钮控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制单选钮。选择它,在属性窗口中设置单选钮的属性。常见属性的设置请参见2.2.2小节。用Caption属性设置单选钮的文本,用Value属性设置或返回单选钮是否被选中,值为True时表示被选中,值为False时表示没选中。

运行时动态创建单选钮控件,使用Controls集合的Add方法。下面的代码创建两个指定位置,文本分别为“单选钮选项1”和“单选钮选项2”的单选钮,第1个单选钮选中。示例文件的存放路径为Samples\ch14\Excel VBA\单选钮.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim optNew As Object
  Set optNew = Me.Controls.Add("forms.optionbutton.1", "Option1", True)
  With optNew
    .Left = 10: .Top = 10
    .Caption = "单选钮选项1"
    .Value = True
  End With
  Dim optNew2 As Object
  Set optNew2 = Me.Controls.Add("forms.optionbutton.1", "Option2", True)
  With optNew2
    .Left = 10: .Top = 30
    .Caption = "单选钮选项2"
    .Value = False
  End With
End Sub

【Python】

Python Tkinter中用Radiobutton函数创建单选钮控件。单选钮控件的常用属性请参见2.2.2小节内容。用text属性设置单选钮的标题,用variable属性绑定变量,属于同一组的单选钮绑定一个共同的变量,用value属性设置或返回值,用command属性定义单击单选钮时的响应,用函数定义响应。

下面创建2个单选钮,第1个单选钮表示男性性别,未选中;第2个单选钮表示女性性别,选中。创建1个淡绿色命令按钮,单击它时调用OptBtn函数,根据单选钮的选中状态输出对应的内容。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\单选钮.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('300x120+100+100')
def OptBtn():
    if g1.get()==0:
        print('你是男生')
    else:
        print('你是女生')
g1=IntVar()  #创建变量g1,同一组单选钮绑定同一个变量
g1.set(0)  #选择第1个单选钮
#创建2个单选钮
rdn1=Radiobutton(form,text='男',variable=g1,value=0)
rdn1.grid()
rdn2=Radiobutton(form,text='女',variable=g1,value=1)
rdn2.grid()
#创建命令按钮
btn=Button(form,text='确定',width=8,command=OptBtn)
btn.grid(pady=10)
btn['background']=7;lightgreen'  #背景色为淡绿色
form.mainloop()

运行脚本,效果如图2-7所示。

Document Image

图2-7 创建单选钮控件

运行脚本时,单击第1个单选钮,单击“确定”按钮,在Python Shell窗口输出下面的内容。

code.python
>>> = RESTART: …\Samples\ch64-界面\Python\单选钮.py
你是男生

核选框控件

可用一组核选框控件实现多项选择。

【Excel VBA】

设计时创建核选框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制核选框。选择它,在属

设计时创建核选框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制核选框。选择它,在属性窗口中设置核选框的属性。常见属性的设置请参见2.2.2小节。用Caption属性设置核选框的文本,用Value属性设置或返回核选框是否被选择,值为True时表示被选择,值为False时表示没被选择。

运行时动态创建核选框控件,使用Controls集合的Add方法。下面的代码创建两个指定位置,文本分别为“核选框选项1”和“核选框选项2”的核选框。示例文件的存放路径为Samples\ch14\Excel VBA\核选框.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim chkNew As Object
  Set chkNew = Me.Controls.Add("forms.checkbox.1", "Check1", True)
  With chkNew
    .Left = 10: .Top = 10
    .Caption = "核选框选项1"
    .Value = True
  End With
  Dim chkNew2 As Object
  Set chkNew2 = Me.Controls.Add("forms.checkbox.1", "Check2", True)
  With chkNew2
    .Left = 10: .Top = 30
    .Caption = "核选框选项2"
    .Value = False
  End With
End Sub

【Python】

Python Tkinter中用Checkbutton函数创建核选框控件。核选框控件的常用属性请参见2.2.2小节内容。用text属性设置核选框的标题,用variable属性绑定变量,不同核选框绑定不同的变量,用value属性设置或返回值,用command属性定义单击核选框时的响应,用函数定义响应。

下面创建3个核选框,第1个核选框表示音乐性别,选中;第2个核选框表示美术爱好,未选中;第3个核选框表示体育爱好,未选中。创建1个淡绿色命令按钮,单击它时调用ChkBtn函数,根据核选框的选中状态输出对应的内容。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\核选框.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('300x120+100+100')
def ChkBtn():
    str=''
    if g1.get()==True:
        str=str+chk1['text']+' '
    if g2.get()==True:
        str=str+chk2['text']+' '
    if g3.get()==True:
        str=str+chk3['text']
    print('你的爱好是:'+str)
g1=DoubleVar(value=True)  #创建布尔型变量g1,默认选择
g2=DoubleVar()  #创建布尔型变量g1
g3=DoubleVar()  #创建布尔型变量g1
#创建核选框,分别绑定不同的变量
chk1=Checkbutton(form,text='音乐',variable=g1)
chk1.grid()
chk2=Checkbutton(form,text='美术',variable=g2)
chk2.grid()
chk3=Checkbutton(form,text='体育',variable=g3)
chk3.grid()
#创建按钮
btn=Button(form,text='确定',width=8,command=ChkBtn)
btn.grid(pady=10)
btn['background']=7;lightgreen'  #背景色为淡绿色
form.mainloop()

运行脚本,效果如图2-8所示。

Document Image

图2-8 创建和使用核选框控件

运行脚本时,选择第1个和第3个核选框,单击“确定”按钮,在Python Shell窗口输出下面的内容。

code.python
>>> = RESTART: …\Samples\ch64-界面\Python\核选框.py
你的爱好是:音乐 体育

列表框控件

列表框控件用于在界面上列出多个选项,可以从中进行选择。

【Excel VBA】

设计时创建列表框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制列表框。选择它,在属

设计时创建列表框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制列表框。选择它,在属性窗口中设置列表框的属性。常见属性的设置请参见2.2.2小节。列表框控件的特有属性和方法包括:

ColumnCount属性 列表框的列数。

ColumnHeads属性 是否将第1行的数据作为表头。

ColumnWidths属性 指定各列的列宽,如”70磅;60磅;50磅”或”2厘米;2厘米;3厘米”

RowSource属性 指定数据源,如”Sheet1!A1:E5”,表示Sheet1工作表中A1:E5单元格区域中的数据。

ListStyle属性 列表框的样式,可有普通样式和单选钮样式。

BoundColumn属性 有多列时,指定将选定行中哪一列的值作为Value属性的值。

TextColumn属性 有多列时,指定将选定行中哪一列的值作为Text属性的值。

MultiSelect属性 值为0时表示每次只能选1个;值为1时表示多项选择;值为2时表示扩展多选,按住Shift键时实现连续多选,按住CTRL键时实现不连续多选。

Value属性 列表框中当前选择的值。

Text属性 列表框中当前选择的文本。

ControlSource属性 当前选择的某值(Value属性的值)在指定单元格中显示,比如"A1"。

ListIndex属性 指定或返回当前选中的选项的编号。

ListCount属性 返回列表框中选项的个数。

List属性 可用数组指定列表数据。

AddItem方法 向列表中添加选项。

RemoveItem方法 删除列表中的指定选项。

设计时创建列表框后,可以结合窗体对象的Activate事件向列表中添加数据,实现列表框内容的初始化。

code.vba
Private Sub UserForm_Activate()
  With ListBox1
    .AddItem "北京"
    .AddItem "上海"
    .AddItem "广州"
    .ListIndex = 0
  End With
End Sub

运行时动态创建列表框控件,使用Controls集合的Add方法。下面的代码创建一个指定位置和大小的列表框,给列表框添加3个选项,其中第1个选项被选中。示例文件的存放路径为Samples\ch14\Excel VBA\列表框.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim lstNew As Object
  Set lstNew = Me.Controls.Add("forms.listbox.1", "list1", True)
  With lstNew
    .Left = 10: .Top = 10
    .Width = 100: .Height = 50
    .AddItem "北京"
    .AddItem "上海"
    .AddItem "广州"
    .ListIndex = 0
  End With
End Sub

【Python】

Python Tkinter中用Listbox函数创建列表框控件。列表框控件的常用属性请参见2.2.2小节内容。用text属性设置核选框的标题,用value属性设置或返回值,用command属性定义单击列表框时的响应,用函数定义响应。

下面创建1个列表框,用insert方法向列表框中插入数据,选择第4个数据。创建1个淡绿色命令按钮,单击它时调用Lst函数,输出选中的内容。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\列表框.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('300x200+100+100')
def Lst():
    idx=lst.curselection()
    for i in idx:
        print('当前选项:'+lst.get(i))
#创建列表框
lst=Listbox(form,height=7)
lst.pack(padx=10,pady=10)
#向列表框写入数据
strs=('高中','中专','大专','本科','研究生')
lst.insert(END,*strs)
lst.select_set(3)  #默认选择本科
#单击按钮,从列表框读取数据
btn=Button(form,text='确定',width=8,command=Lst)
btn.pack(pady=10)
btn['background']=7;lightgreen'  #背景色为淡绿色
form.mainloop()

运行脚本,效果如图2-9所示。

Document Image

图2-9 创建和使用列表框

运行脚本时,选择第4个选项,单击“确定”按钮,在Python Shell窗口输出下面的内容。

code.python
>>> = RESTART: …\Samples\ch64-界面\Python\列表框.py
当前选项:本科

设置列表框对象的selectmode属性的值为'multiple',可以在列表框中实现多选。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\列表框2.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('300x200+100+100')
def Lst():
    idx=lst.curselection()
    str=''
    for i in idx:
        str=str+lst.get(i)+' '
    print('当前选项:'+str)
#创建列表框
#...省略
lst['selectmode']='multiple'
#单击按钮,从列表框读取数据
#...省略
form.mainloop()

运行脚本,效果如图2-10所示。

Document Image

图2-10 实现列表框中选项的多选

运行脚本时,选择第2, 4和5项,单击“确定”按钮,在Python Shell窗口输出下面的内容。

code.python
>>> = RESTART: …\Samples\ch64-界面\Python\列表框2.py
当前选项:中专 本科 研究生

组合框控件

组合框控件是文本框和列表框的组合,列出多个选项,可以从中进行选择。

【Excel VBA】

设计时创建组合框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制组合框。选择它,在属

设计时创建组合框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制组合框。选择它,在属性窗口中设置组合框的属性。常见属性的设置请参见2.2.2小节。组合框控件的特有属性和方法与列表框的基本相同,请参阅。

设计时创建组合框后,可以结合窗体对象的Activate事件用组合框对象的AddItem方法向列表中添加数据,操作与列表框的相同。

运行时动态创建列表框控件,使用Controls集合的Add方法。下面的代码创建一个指定位置的列表框,给列表框添加3个选项,其中第1个选项被选中。示例文件的存放路径为Samples\ch14\Excel VBA\组合框.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim cmbNew As Object
  Set cmbNew = Me.Controls.Add("forms.combobox.1", "combo1", True)
  With cmbNew
    .Left = 100: .Top = 50
    .AddItem "北京"
    .AddItem "上海"
    .AddItem "广州"
    .ListIndex = 0
  End With
End Sub

【Python】

Python Tkinter中创建组合框需要导入ttk模块,用该模块的Combobox函数创建组合框控件。用value属性设置数据,用current方法指定默认值,该方法的参数为组合框选项编号,基数为0。

下面创建1个组合框,用value属性向组合框中添加数据,选择第1个数据作为默认值。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\组合框.py。

code.python
from tkinter import *
from tkinter import ttk   #导入ttk模块

form = Tk()
form.geometry('300x200+100+100')
# 创建组合框
cmb = ttk.Combobox(form)
cmb.pack(padx=10,pady=50)
# 添加数据
cmb['value'] = ('北京','上海','广州')
# 设置默认值
cmb.current(0)
form.mainloop()

运行脚本,效果如图2-11所示。

Document Image

图2-11 创建组合框

旋转按钮

使用旋转按钮可以用上下翻动的方式设置值。旋转按钮可以看作是只有两端按钮的滚动条。

【Excel VBA】

设计时创建旋转按钮控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制旋转按钮。选择它,

设计时创建旋转按钮控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制旋转按钮。选择它,在属性窗口中设置旋转按钮的属性。常见属性的设置请参见2.2.2小节。用Min属性设置最小值,用Max属性设置最大值,用SmallChange属性设置步长,用Value属性返回当前的值。

运行时动态创建旋转按钮控件,使用Controls集合的Add方法。下面的代码创建一个指定位置和大小,步长为1的旋转按钮。示例文件的存放路径为Samples\ch14\Excel VBA\旋转按钮.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim spnNew As Object
  Set spnNew = Me.Controls.Add("forms.spinbutton.1", "spin1", True)
  With spnNew
    .Left = 10: .Top = 10
    .Min = 0: .Max = 10
    .SmallChange = 1
  End With
End Sub

【Python】

Python Tkinter中用Spinbox函数创建旋转按钮控件。旋转按钮控件的常用属性请参见2.2.2小节内容。用from属性和to属性设置最小值和最大值,用get方法获取当前值,用wrap属性设置是否循环使用数据。

下面创建1个旋转按钮,取0到20之间的数,可循环使用。创建1个淡绿色命令按钮,单击它时调用Spn函数,输出旋转按钮的当前值。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\旋转按钮.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry('300x120+100+100')
def Spn():
    print('当前值:'+spn.get())
#创建旋转按钮
spn=Spinbox(form,from_=0,to=20)
spn.pack(padx=10,pady=10)
spn['wrap7;]=True  #可循环
#单击按钮,从列表框读取数据
btn=Button(form,text='确定',width=8,command=Spn)
btn.pack(pady=10)
btn['background']=7;lightgreen'  #背景色为淡绿色
form.mainloop()

运行脚本,效果如图2-12所示。

Document Image

图2-12 创建和使用旋转按钮

运行脚本时,单击旋转按钮中的向上或向下按钮,当前值为6时,单击“确定”按钮,在Python Shell窗口输出下面的内容。

code.vba
= RESTART: …\Samples\ch64-界面\Python\旋转按钮.py
当前值:6

方框控件

方框控件是一个容器控件,可以包含其他控件。

【Excel VBA】

设计时创建方框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制方框。选择它,在属性窗

设计时创建方框控件,在工具箱中单击按钮,在窗体上通过鼠标单击和拖拉即可交互绘制方框。选择它,在属性窗口中设置方框的属性。常见属性的设置请参见2.2.2小节。

运行时动态创建方框控件,使用Controls集合的Add方法。下面的代码创建一个指定位置和大小的方框。示例文件的存放路径为Samples\ch14\Excel VBA\方框.xlsm。

code.vba
Private Sub UserForm_Activate()
  Dim fmNew As Object
  Set fmNew = Me.Controls.Add("forms.frame.1", "Frame1", True)
  With fmNew
    .Left = 10: .Top = 10
    .Width = 100: .Height = 50
  End With
End Sub

【Python】

Python Tkinter中用LabelFrame函数创建方框控件。方框控件的常用属性请参见2.2.2小节内容。用text属性设置方框的文本。

下面创建1个方框,并在方框中放置2个单选钮。注意,创建单选钮时将方框作为容器对象。编写Python脚本,脚本文件的存放路径为Samples\ch14\Python\方框.py。

code.python
from tkinter import *
#窗体
form=Tk()
form.geometry(‘300x120+100+100’)
#创建方框
lfr=LabelFrame(form,text=’性别’)
lfr.pack(padx=10,pady=10)
#向方框中添加单选钮,将方框作为容器对象
g1=IntVar(0)
rdn1=Radiobutton(lfr,text=’男’,variable=g1,value=0)
rdn1.pack(padx=20)
rdn2=Radiobutton(lfr,text=’女’,variable=g1,value=1)
rdn2.pack(padx=20)
form.mainloop()

运行脚本,效果如图2-13所示。

Document Image

图2-13 创建方框控件