控件之Listbox Combobox Spinbox

#Listbox:
Listbox 代表一个列表框,用户可通过列表框来选择一个列表项。
ttk 模块下的 Combobox 则是 Listbox 的改进版,它既提供了单行文本框让用户直接输入(就像 Entry 一样),
也提供了下拉列表框供用户选择(就像 Listbox 一样),因此它被称为复合框。

创建 Listbox 两步:
1.创建 Listbox 对象,并为之执行各种选项。Listbox 除支持大部分通用选项之外,还支持 selectmode 选项,
用于设置 Listbox 的选择模式。
2.调用 Listbox 的 insert(self, index, *elements) 方法来添加选项。从最后一个参数可以看出,
该方法既可每次添加一个选项,
也可传入多个参数,每次添加多个选项。index 参数指定选项的插入位置,它支持 
END(结尾处)、ANCHOR(当前位置)和 ACTIVE(选中处)等特殊索引。

Listbox 的 selectmode 支持的选择模式有如下几种:
'browse':单选模式,支持按住鼠标键拖动来改变选择。
'multiple':多边模式。
'single':单边模式,必须通过鼠标键单击来改变选择。
'extended':扩展的多边模式,必须通过 CtrL 或 Shift 键辅助实现多选。
除了最常见的 insert() 方法,Listbox 还支持如下常见的操作列表项的方法:
selection_set(self, first, last=None):
选中从 first 到 last(包含)的所有列表项。如果不指定 last,则直接选中 first 列表项。
selection_clear(self, first, last=None):
取消选中从 first 到 last(包含)的所有列表项。如果不指定 last,则只取消选中 first 列表项。
delete(self, first, last=None):
删除从 first 到 last(包含)的所有列表项。如果不指定 last,则只删除 first 列表项。
Listbox 也支持使用 listvariable 选项与变量进行绑定,但这个变量并不是控制 Listbox 选中哪些项,
而是控制 Listbox 包含哪些项。简单来说,如果 listvariable 选项与变量进行了双向绑定,
则无须调用 insert()、delete() 方法来添加、删除列表项,只要通过绑定变量即可改变 Listbox 中的列表项。

如果程序要获取 Listbox 当前选中的项,则可通过 curselection() 方法来实现,该方法会返回一个元组,
该元组包含当前 Listbox 的选中项。
Listbox 并不支持使用 command 选项来绑定事件处理函数或方法,如果程序需要为 Listbox 绑定事件处理函数或方法,
则可通过 bind() 方法来实现。
#Combobox:
Combobox 的用法更加简单,程序可通过 values 选项直接为它设置多个选项。

Combobox 还可通过 postcommand 选项指定事件处理函数或方法,当用户单击 Combobox 的下拉箭头时,
程序就会触发 postcomrnand 选项指定的事件处理函数或方法。

该组件的 state 选项支持‘readonly’只读和’enable‘读写状态,该状态代表 Combobox 的文本框不允许编辑,
只能通过下拉列表框的列表项来改变。

Combobox 同样可通过 textvariable 选项将它与指定变量绑定,这样程序可通过该变量来获取或修改 Combobox 组件的值。

#Spinbox:
Spinbox 控件是一个带有两个小箭头的文本框,用户既可以通过两个小箭头上下调整该组件内的值,
也可以直接在文本框内输入内容作为该组件的值。

Spinbox 本质上也相当于持有一个列表框,这一点类似于 Combobox,但 Spinbox 不会展开下拉列表供用户选择。
Spinbox 只能通过向上、向下箭头来选择不同的选项。

在使用 Spinbox 组件时,既可通过 from(由于 from 是关键字,实际使用时写成 from_)、to、increment 选项来指定
选项列表,也可通过 values 选项来指定多个列表项,该选项的值可以是 list 或 tuple。

Spinbox 同样可通过 textvariable 选项将它与指定变量绑定,这样程序即可通过该变量来获取或修改 Spinbox 组件的值。

Spinbox 还可通过 command 选项指定事件处理函数或方法,即当用户单击 Spinbox 的向上、向下箭头时,
程序就会触发 command 选项指定的事件处理函数或方法。
from tkinter import *
from tkinter import ttk

root = Tk()
root.resizable(0,0)

tabControl = ttk.Notebook(root)  #窗口下创建Notebook
tabControl.pack(expand=1, fill="both")  # 添加notebook,窗口显示

tab1 = Frame(tabControl)  # notebook下创建frame
tabControl.add(tab1, text='Listbox')  # 添加frame到notebook显示

tab2 = Frame(tabControl)  # Add a second tab
tabControl.add(tab2, text='Combobox')  # Make second tab visible

tab3 = Frame(tabControl)
tabControl.add(tab3, text='Spinbox')

#------------------------Listbox-------------------------
firstF = Frame(tab1)
firstF.pack(fill=Y, expand=YES)
#创建Listbox:
lb = Listbox(firstF)
lb.pack(side=LEFT, fill=Y, expand=YES)
#创建Listbox的变量:先创建后赋值,反之则为listbox为空
strVar2 = StringVar()
lb['listvariable'] = strVar2

prolans = ['Java','C','C++','VB','PHP','C#','Python','Perl','Delphi','JavaScript','Ruby']

for prolan in prolans:
    lb.insert(END, prolan)
# 或直接使用多个元素来插入,anchor当前位置
lb.insert(ANCHOR, 'D', 'PL/SQL', 'SAS', 'Logo')

# 创建Scrollbar:
scroll = Scrollbar(firstF, command=lb.yview)
scroll.pack(side=RIGHT, fill=Y)
lb.configure(yscrollcommand=scroll.set)

#创建模式单选按钮
secondF = Frame(tab1)
secondF.pack()

def choose_mode():
    print(strVar1.get())
    lb['selectmode'] = strVar1.get()

modes = ('browse','single','multiple','extended')
strVar1 = StringVar()
for mode in modes:
    rb = Radiobutton(secondF, text=mode, value=mode,
                         variable=strVar1, command=choose_mode)
    rb.pack(side=LEFT)
strVar1.set('browse')

#创建操作列表项的按钮
thirdF = Frame(tab1)
thirdF.pack()

def select():
   lb.selection_set(0, 5)
def clear_select():
    lb.selection_clear(1, 3)
def delete():
    lb.delete(0,2)
def var_select():
    strVar2.set(('Python', 'PHP','C'))
def var_all():
    strVar2.set(('Java','C','C++','VB','PHP','C#','Python','Perl','Delphi','JavaScript','Ruby',
                 'D', 'PL/SQL', 'SAS', 'Logo'))

Button(thirdF, text="选中5项", command=select).pack(side=LEFT)
Button(thirdF, text="取消选中3项", command=clear_select).pack(side=LEFT)
Button(thirdF, text="删除3项", command=delete).pack(side=LEFT)
Button(thirdF, text="绑定变量", command=var_select).pack(side=LEFT)
Button(thirdF, text="显示全部", command=var_all).pack(side=LEFT)

# 为双击事件绑定事件处理方法
def doubleclick(event):
    from tkinter import messagebox
    messagebox.showinfo(title=None, message=str(lb.curselection()))
    messagebox.showinfo(title=None, message=lb.curselection())

lb.bind("<Double-1>", doubleclick)

#------------------------Combobox-------------------------
forthF = Frame(tab2)
forthF.pack()

def choose():
    from tkinter import messagebox
    messagebox.showinfo(title=None, message=cb.get())#strVar4.get()
def change():
    print(intVar1.get())
    cb['state'] = 'readonly' if intVar1.get() else 'enable'
def setvalue():
    strVar3.set('Python')

strVar3 = StringVar()
cb = ttk.Combobox(forthF,textvariable=strVar3,postcommand=choose)#创建
cb.pack(side=TOP)#显示
cb['values'] = ['Python', 'C', 'C++', 'Java']#赋值
strVar3.set('C')

intVar1 = IntVar()#或BooleanVar()
Checkbutton(forthF, text='只读', variable=intVar1,command=change).pack(side=LEFT)


Button(forthF, text='绑定变量',command=setvalue).pack(side=LEFT)


#------------------------Spinbox-------------------------

Label(tab3, text='指定from、to、increment').pack()
sb1 = Spinbox(tab3, from_ = 20,to = 100,increment = 5)
sb1.pack()


def press():
    print(sb2.get())

Label(tab3, text='指定values').pack()
sb2 = Spinbox(tab3,values=('Python', 'C', 'C++', 'Java'),command=press)
sb2.pack()

Label(tab3, text='绑定变量').pack()
intVar = IntVar()
sb3 = Spinbox(tab3,values=list(range(20, 100, 4)),textvariable=intVar,command=press)
sb3.pack()
intVar.set(33)

root.mainloop()

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值