tkinter -- Listbox

Listbox 为列表框控件,它可以包含一个或多个文本项(text item),可以设置为单选或多选

创建一个 Listbox,向其中添加三个 item

示例:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root)
for item in ['py3study', 'python', 'tkinter']:
    lb.insert(tk.END, item)
lb.pack()
root.mainloop()

效果:

创建一个可以多选的 Listbox,使用属性 selectmaod

代码:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root, selectmode=tk.MULTIPLE)
for item in ['py3study', 'python', 'tkinter']:
    lb.insert(tk.END, item)
lb.pack()
root.mainloop()

效果:

依次点击这三个 item,均显示为选中状态。属性 MULTIPLE 允许多选,每次点击 item,它将改变自己的当前选状态,与 Checkbox 有点相似

这个属性 selectmode 还可以设置为 BROWSE,可以通过鼠标来移动 Listbox 中的选中位置(不是移动 item),这个属性也是 Listbox 在默认设置的值,这个程序与1.程序运行的结果的一样的

示例:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root, selectmode=tk.BROWSE)
for item in ['py3study', 'python', 'tkinter']:
    lb.insert(tk.END, item)
lb.pack()
root.mainloop()

效果:

使用鼠标进行拖动,可以看到选中的位置随之变化。与 BROWSE 相似 的为 SINGLE,但不支持鼠标移动选中位置

使用 selectmode = EXPANDED 使用 Listbox 来支持 Shift 和 Control

运行程序,点中“python",shift + 点击"tkinter",会选中所有的 item

运行程序,点中"python",control + 点击"py3study",会选中 python 和 py3study,第二项tkinter 处于非选中状态

示例:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root, selectmode=tk.EXTENDED)
for item in ['py3study', 'python', 'tkinter']:
    lb.insert(tk.END, item)
lb.pack()
root.mainloop()

效果:

向 Listbox 中添加一个 item

以上的例子均使用了 insert 来向 Listbox 中添加 一个 item,这个函数有两个属性一个为添加的索引值,另一个为添加的项(item)

有两个特殊的值 ACTIVE 和 END,ACTIVE 是向当前选中的 item 前插入一个(即使用当前选中的索引作为插入位置);END 是向Listbox 的最后一项添加插入一项先向 Listbox 中追加三个 item,再在 Listbox 开始添加三项

示例:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root)
for item in ['py3study', 'python', 'tkinter']:
    lb.insert(tk.END, item)
# 只添加一项将[]作为一个 item
lb.insert(0, ['linux', 'windows', 'unix'])
# 添加三项,每个 string 为一个 item
lb.insert(0, 'linux', 'windows', 'unix')

lb.pack()
root.mainloop()

效果:

删除 Listbox 中的项,使用 delete,这个函数也有两个参数,第一个为开始的索引值;第二个为结束的索引值,如果不指定则只删除第一个索引项

示例:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i))
lb.delete(1, 3)


lb.pack()
root.mainloop()
#lb.delete(0,END) #删除全部内容

效果:

运行程序,只有1-3被删除

删除全部内容,使用 delete 指定第一个索引值0和最后一个参数 END,即可

选中操作函数,使用函数实现。selection_set 函数有两个参数第一个为开始的索引;第二个为结束的索引,如果不指定则只选中第一个参数指定的索引项

示例:

import tkinter as tk

root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i))

lb.selection_set(0, 10)
lb.pack()

root.mainloop()

效果:

程序运行结果,选中了所有的项。 此代码并未指定 Listbox 为 MULTIPLE 或 EXTENDED,查通过 selection_set 仍旧可以对 Listbox进行操作

与之相对的便是取消选中的函数了,参数与 selection_set 在参数相同,如下代码取消索引从0-3在状态

示例:

import tkinter as tk
root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i))

lb.selection_set(0, 10)
lb.selection_clear(0,3)
lb.pack()

root.mainloop()

效果:

得到当前 Listbox 中的 item 个数

示例:

import tkinter as tk
root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i))
lb.delete(3)
print(lb.size())
lb.pack()
root.mainloop()

效果:

首先向 Listbox 中添加 了10个 item,然后删除索引为3在 item,最后的打印结果为9,即当前的 Listbox 中只有9项

返回指定索引的项

示例:

import tkinter as tk
root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i*100))

print(lb.get(3))
lb.pack()
root.mainloop()

效果:

get 也为两个参数的函数,可以返回多个项(item),如下返回索引值3-7的值

示例:

import tkinter as tk
root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i*100))

print(lb.get(3, 7))
lb.pack()
root.mainloop()

效果:

返回值为('300', '400', '500', '600', '700'),是一个 tuple 类型

返回当前返回的项的索引,不是 item 的值

示例:

import tkinter as tk
root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i*100))

lb.selection_set(3, 8)
print(lb.curselection())
lb.pack()
root.mainloop()

效果:

返 回 值 为 ('3', '4', '5', '6', '7', '8') , 而 不 是('300','400','500','600','700','800'),知道了索引,得到值,就很容易了:lb.get()就可以实现

判断 一个项是否被选中,使用索引

示例:

import tkinter as tk
root = tk.Tk()
lb = tk.Listbox(root)
for i in range(10):
    lb.insert(tk.END, str(i*100))

lb.selection_set(3, 8)
print(lb.selection_includes(8))
print(lb.selection_includes(0))
lb.pack()
root.mainloop()

效果:

返回结果:True Flase,即8包含在选中的索引中,0不包含在选中的索引中

Listbox 与变量绑定

示例:

import tkinter as tk
root = tk.Tk()
v = tk.StringVar()
lb = tk.Listbox(root, listvariable=v)
for i in range(10):
    lb.insert(tk.END, str(i*100))
# 打印当前列表中的项值
print(v.get())
# 输出:('0', '100', '200', '300', '400', '500', '600', '700', '800', '900')

# 改变v的值,使用tuple可以与item对应
v.set(('1000', '200'))
# 结果只有两项了1000和200
lb.pack()
root.mainloop()

效果:

Listbox 与事件绑定

它不支持 command 属性来设置回调函数了,使用 bind 来指定回调函数,打印当前选中的值

示例:

import tkinter as tk

root = tk.Tk()
def printlist(event):
    print(lb.get(lb.curselection()))

lb = tk.Listbox(root)

lb.bind('<Double-Button-1>', printlist)
for i in range(10):
    lb.insert(tk.END, str(i*100))
lb.pack()
root.mainloop()

效果:

还有一个比较实用的功能没有介绍:滚动条的添加,留到后面介绍 Scrollbar 的时候再一并介绍

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禹都一只猫博客

Go语言简介 — 特性

13510
来自专栏魂祭心

原 利用Appdomain动态加载程序集,

37780
来自专栏码生

React Native 大纲

9430
来自专栏五毛程序员

thymeleaf-extras-db 0.0.1发布,select标签加载数据的新姿势

在写thymeleaf页面的时候,我为了偷懒,不想为每个select下拉列表框都写一个接口,于是这个懒人jar诞生了。该jar的核心功能是直接通过thymele...

14430
来自专栏Golang语言社区

【转载】记Golang数据库查询封装的坑

前文 golang接触也有一段时间,项目中有用到web api,基本上就是post json格式的,本想用java来写,刚下手想到java太臃肿,各种繁琐。觉得...

58070
来自专栏GreenLeaves

C# 文件操作系列一

在.Net环境中,所有关于文件操作的类都在System.IO命名空间下,注:在修改文件时,安全性显得格外重要,但是本随笔不过多讲述安全性,这里假设我们有足够的权...

31250
来自专栏小古哥的博客园

HTML5复习整理

一、推出的目标 web浏览器兼容性低;文档结构不明确;web应用程序的功能受限 二、语法的改变 内容类型(html或htm);DOCTYPE声明简化;指定字符编...

39870
来自专栏WindCoder

Angular6自定义表单控件方式集成Editormd

曾经找到过“Editor.md”,看之心喜,一直想在Angular中集成下这款markdownpad编辑器玩,在网上也只找到一篇通过指令集成的,虽然可以实现,但...

62920
来自专栏GIS讲堂

Arcgis for Js实现graphiclayer的空间查询(续)

上文中,实现了简单的针对graphiclayer的空间查询工作,在本节,将更加详细的介绍针对graphiclayer的空间查询。首先,空间查询的方式:提供多种类...

14730
来自专栏web前端-

rem和em小插曲

1.对em来说,它的大小是相对于父层font-size来改变,但是如果其自身有font-size属性的话,em会优先考虑自身的font-size;

10520

扫码关注云+社区

领取腾讯云代金券