首页 > Python基础教程 > Tkinter
阅读:6,661
Python Tkinter Listbox和Combobox控件用法
Listbox 代表一个列表框,用户可通过列表框来选择一个列表项。ttk 模块下的 Combobox 则是 Listbox 的改进版,它既提供了单行文本框让用户直接输入(就像 Entry 一样),也提供了下拉列表框供用户选择(就像 Listbox 一样),因此它被称为复合框。
程序创建 Listbox 起码需要两步:
Listbox 的 selectmode 支持的选择模式有如下几种:
下面程序示范了 Listbox 的基本用法:
运行上面程序,可以看到如图 1 所示的效果:
图 1 Listbox 的运行效果
除了最常见的 insert() 方法,Listbox 还支持如下常见的操作列表项的方法:
Listbox 也支持使用 Iistvariable 选项与变量进行绑定,但这个变量并不是控制 Listbox 选中哪些项,而是控制 Listbox 包含哪些项。简单来说,如果 listvariable 选项与变量进行了双向绑定,则无须调用 insert()、delete() 方法来添加、删除列表项,只要通过绑定变量即可改变 Listbox 中的列表项。
下面程序示范了操作 Listbox 中选项的方法:
图 2 操作列表项
如果程序要获取 Listbox 当前边中的项,则可通过 curselection() 方法来实现,该方法会返回一个元组,该元组包含当前 Listbox 的所有选中项。
Listbox 并不支持使用 command 选项来绑定事件处理函数或方法,如果程序需要为 Listbox 绑定事件处理函数或方法,则可通过 bind() 方法来实现。下面程序示范了通过 bind() 方法为 Listbox 绑定事件处理方法:
运行上面程序,双击某个列表顷,将可以看到如图 3 所示的运行效果。
图 3 为双击事件绑定事件处理方法
Combobox 的用法更加简单,程序可通过 values 选项直接为它设置多个选项。该组件的 state 选项支持‘readonly’状态,该状态代表 Combobox 的文本框不允许编辑,只能通过下拉列表框的列表项来改变。
Combobox 同样可通过 textvariable 选项将它与指定变量绑定,这样程序可通过该变量来获取或修改 Combobox 组件的值。
Combobox 还可通过 postcommand 选项指定事件处理函数或方法,当用户单击 Combobox 的下拉箭头时,程序就会触发 postcomrnand 选项指定的事件处理函数或方法。
下面程序示范了 Combobox 组件的用法:
运行上面程序,可以看到如图 4 所示的运行界面:
图 4 Combobox 组件
程序创建 Listbox 起码需要两步:
- 创建 Listbox 对象,并为之执行各种选项。Listbox 除支持大部分通用选项之外,还支持 selectmode 选项,用于设置 Listbox 的选择模式。
- 调用 Listbox 的 insert(self, index, *elements) 方法来添加选项。从最后一个参数可以看出,该方法既可每次添加一个选项,也可传入多个参数,每次添加多个选项。index 参数指定选项的插入位置,它支持 END(结尾处)、ANCHOR(当前位置)和 ACTIVE(选中处)等特殊索引。
Listbox 的 selectmode 支持的选择模式有如下几种:
- 'browse':单选模式,支持按住鼠标键拖动来改变选择。
- 'multiple':多边模式。
- 'single':单边模式,必须通过鼠标键单击来改变选择。
- 'extended':扩展的多边模式,必须通过 CtrL 或 Shift 键辅助实现多选。
下面程序示范了 Listbox 的基本用法:
from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): topF = Frame(self.master) topF.pack(fill=Y, expand=YES) # 创建Listbox组件 self.lb = Listbox(topF) self.lb.pack(side=LEFT, fill=Y, expand=YES) for item in ['Python', 'Kotlin', 'Swift', 'Ruby']: self.lb.insert(END, item) # 或直接使用多个元素来插入 self.lb.insert(ANCHOR, 'Python', 'Kotlin', 'Swift', 'Ruby') # 创建Scrollbar组件,设置该组件与self.lb的纵向滚动关联 scroll = Scrollbar(topF, command=self.lb.yview) scroll.pack(side=RIGHT, fill=Y) # 设置self.lb的纵向滚动影响scroll滚动条 self.lb.configure(yscrollcommand=scroll.set) f = Frame(self.master) f.pack() Label(f, text = '选择模式:').pack(side=LEFT) modes = ('multiple', 'browse', 'single', 'extended') self.strVar = StringVar() for m in modes: rb = ttk.Radiobutton(f, text = m, value = m, variable = self.strVar, command = self.choose_mode) rb.pack(side=LEFT) self.strVar.set('browse') def choose_mode(self): print(self.strVar.get()) self.lb['selectmode'] = self.strVar.get() root = Tk() root.title("Listbox测试") # 改变窗口图标 root.iconbitmap('images/fklogo.ico') App(root) root.mainloop()上面程序中,第 15 行代码表示每次插入一个选项,因此程序使用循环来控制插入多个选项;第 17 行代码则表示直接插入多个选项;第 35 行代码根据用户选择来改变 Listbox 的 Selectmode 选项,这样读者可以体会 Listbox 不同选项的差异。
运行上面程序,可以看到如图 1 所示的效果:
图 1 Listbox 的运行效果
除了最常见的 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 也支持使用 Iistvariable 选项与变量进行绑定,但这个变量并不是控制 Listbox 选中哪些项,而是控制 Listbox 包含哪些项。简单来说,如果 listvariable 选项与变量进行了双向绑定,则无须调用 insert()、delete() 方法来添加、删除列表项,只要通过绑定变量即可改变 Listbox 中的列表项。
下面程序示范了操作 Listbox 中选项的方法:
from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): topF = Frame(self.master) topF.pack(fill=Y, expand=YES) # 定义StringVar变量 self.v = StringVar() # 创建Listbox组件,与v变量绑定 self.lb = Listbox(topF, listvariable = self.v) self.lb.pack(side=LEFT, fill=Y, expand=YES) for item in range(20): self.lb.insert(END, str(item)) # 创建Scrollbar组件,设置该组件与self.lb的纵向滚动关联 scroll = Scrollbar(topF, command=self.lb.yview) scroll.pack(side=RIGHT, fill=Y) # 设置self.lb的纵向滚动影响scroll滚动条 self.lb.configure(yscrollcommand=scroll.set) f = Frame(self.master) f.pack() Button(f, text="选中10项", command=self.select).pack(side=LEFT) Button(f, text="清除选中3项", command=self.clear_select).pack(side=LEFT) Button(f, text="删除3项", command=self.delete).pack(side=LEFT) Button(f, text="绑定变量", command=self.var_select).pack(side=LEFT) def select(self): # 选中指定项 self.lb.selection_set(0, 9) def clear_select(self): # 取消选中指定项 self.lb.selection_clear(1,3) def delete(self): # 删除指定项 self.lb.delete(5, 8) def var_select(self): # 修改与Listbox绑定的变量 self.v.set(('12', '15')) root = Tk() root.title("Listbox测试") # 改变窗口图标 root.iconbitmap('images/fklogo.ico') App(root) root.mainloop()上面程序中第 31 行代码控制选中列表项中第一个到第十个选项;第 34 行代码控制取消选中列表项中的 3 项; 第 37 行代码删除列表项中的 4 项;第 40 行代码通过绑定变量来改变 Listbox 中的列表项。运行上面程序,删除其中 4 项之后的运行效果如图 2 所示。
图 2 操作列表项
如果程序要获取 Listbox 当前边中的项,则可通过 curselection() 方法来实现,该方法会返回一个元组,该元组包含当前 Listbox 的所有选中项。
Listbox 并不支持使用 command 选项来绑定事件处理函数或方法,如果程序需要为 Listbox 绑定事件处理函数或方法,则可通过 bind() 方法来实现。下面程序示范了通过 bind() 方法为 Listbox 绑定事件处理方法:
from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): topF = Frame(self.master) topF.pack(fill=Y, expand=YES) # 创建Listbox组件 self.lb = Listbox(topF) self.lb.pack(side=LEFT, fill=Y, expand=YES) for item in range(20): self.lb.insert(END, str(item)) # 创建Scrollbar组件,设置该组件与self.lb的纵向滚动关联 scroll = Scrollbar(topF, command=self.lb.yview) scroll.pack(side=RIGHT, fill=Y) # 设置self.lb的纵向滚动影响scroll滚动条 self.lb.configure(yscrollcommand=scroll.set) # 为双击事件绑定事件处理方法 self.lb.bind("<Double-1>", self.click) def click(self, event): from tkinter import messagebox # 获取Listbox当前选中项 messagebox.showinfo(title=None, message=str(self.lb.curselection())) root = Tk() root.title("Listbox测试") # 改变窗口图标 root.iconbitmap('images/fklogo.ico') App(root) root.mainloop()上面程序中第 22 行代码为 Listbox 的左键双击事件(<Double-1> 绑定了事件处理方法,当用户双击 Listbox 时,程序将会触发该对象的 click 方法;在第 26 行代码则调用了 Listbox 的 curselection() 方法来获取当前选中项。
运行上面程序,双击某个列表顷,将可以看到如图 3 所示的运行效果。
图 3 为双击事件绑定事件处理方法
Combobox 的用法更加简单,程序可通过 values 选项直接为它设置多个选项。该组件的 state 选项支持‘readonly’状态,该状态代表 Combobox 的文本框不允许编辑,只能通过下拉列表框的列表项来改变。
Combobox 同样可通过 textvariable 选项将它与指定变量绑定,这样程序可通过该变量来获取或修改 Combobox 组件的值。
Combobox 还可通过 postcommand 选项指定事件处理函数或方法,当用户单击 Combobox 的下拉箭头时,程序就会触发 postcomrnand 选项指定的事件处理函数或方法。
下面程序示范了 Combobox 组件的用法:
from tkinter import * # 导入ttk from tkinter import ttk class App: def __init__(self, master): self.master = master self.initWidgets() def initWidgets(self): self.strVar = StringVar() # 创建Combobox组件 self.cb = ttk.Combobox(self.master, textvariable=self.strVar, # 绑定到self.strVar变量 postcommand=self.choose) # 当用户单击下拉箭头时触发self.choose方法 self.cb.pack(side=TOP) # 为Combobox配置多个选项 self.cb['values'] = ['Python', 'Ruby', 'Kotlin', 'Swift'] f = Frame(self.master) f.pack() self.isreadonly = IntVar() # 创建Checkbutton,绑定到self.isreadonly变量 Checkbutton(f, text = '是否只读:', variable=self.isreadonly, command=self.change).pack(side=LEFT) # 创建Button,单击该按钮激发setvalue方法 Button(f, text = '绑定变量设置', command=self.setvalue).pack(side=LEFT) def choose(self): from tkinter import messagebox # 获取Combbox的当前值 messagebox.showinfo(title=None, message=str(self.cb.get())) def change(self): self.cb['state'] = 'readonly' if self.isreadonly.get() else 'enable' def setvalue(self): self.strVar.set('我爱Python') root = Tk() root.title("Combobox测试") # 改变窗口图标 root.iconbitmap('images/fklogo.ico') App(root) root.mainloop()上面程序中第 12 行代码将 Combobox 组件绑定到 self.strVar 变量;第 13 行代码为 Combobox 的 command 绑定了事件处理方法;第 32 行代码根据列表框的值来确定 Combobox 是否允许编辑。
运行上面程序,可以看到如图 4 所示的运行界面:
图 4 Combobox 组件
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频