您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

wxPython -高级控件之列表框ListBox

时间:2023-02-27 13:31:45  来源:  作者:爱好史地的coder

实战wxPython/ target=_blank class=infotextkey>Python系列-039

 

wxPythontigo提供了一些高级控件。例如,树形控件、html窗口、网格控件、列表控件、或具有高级样式功能的编辑器等。

一、wx.ListBox列表框

wx.ListBox列表框控件从一个字符串列表中选择一个或者多个字符串。所选字符串显示在一个可以滚动的列表框中,所选中的字符串将特别标记。列表框可以是单选 (如果选择了其中的一个项,则清除先前的选择项)或者多重选择(选择一个项的时,不影响对其他项的选择)。

列表框元素从0开始编号,虽然元素的最大数量是无限的,但通常最好使用虚拟控件,不需要一次性将所有项添加到其中。由于这个控件没有做优化,比如在wx.dataview.DataViewCtrl或者使用LC_VIRTUAL样式的wx.ListCtrl时,需要加载超过上百的项时,性能会有所影响。

注意,列表框不支持除制表符以外的控制字符。

wx.ListBox支持的窗口样式:

  • wx.LB_SINGLE:单选列表。
  • wx.LB_MULTIPLE:多选列表。
  • wx.LB_EXTENDED:扩展选择列表:用户可以使用SHIFT或CTRL键以及光标移动键或鼠标来扩展选择。
  • wx.LB_HSCROLL:如果内容太多,创建水平滚动条(仅限windows)。
  • wx.LB_ALWAYS_SB:始终显示垂直滚动条。
  • wx.LB_NEEDED_SB:只在需要时创建垂直滚动条。
  • wx.LB_NO_SB:不创建垂直滚动条(仅限于wxMSW和wxGTK)。
  • wx.LB_SORT:列表框内容按字母顺序排序。

注意:LB_SINGLE, LB_MULTIPLE和LB_EXTENDED样式是互斥的,最多可以指定其中一个样式(单选是默认设置)。

wx.ListBox发出的事件:

  • EVT_LISTBOX:当列表中的项被选中或选择发生变化时,处理wx.EVT_LISTBOX事件。
  • EVT_LISTBOX_DCLICK:当双击列表框时,处理wx.EVT_LISTBOX_DCLICK事件。

wx.ListBox常用方法

  • Deselect(selfn):取消选择列表框中的项(只适用于多选择列表框)。
  • EnsureVisible(selfn):确保当前显示具有给定索引的项。这个方法只在必要时滚动列表框,如果这个项已经显示,它不会做任何事情。
  • FindString(selfstringcaseSensitive=False):查找与给定字符串匹配的项。
  • GetCount(self):返回控件中的项数。
  • GetCountPerPage(self):返回可以放入列表框垂直可见区域的项数量。如果无法确定每页的条目数,则返回-1。
  • GetSelection(self):返回所选项的索引,如果没有选择项,则返回NOT_FOUND。
  • GetSelections(self):用当前选定项的位置填充整数数组
  • GetString(selfn):返回具有给定索引的项的标签。索引必须是有效的,即小于GetCount返回的值,否则会触发断言。值得注意的是,如果控件为空,则不能调用此函数。
  • GetTopItem(self):返回最上面可见项的索引。如果该方法没有为当前平台实现,则返回NOT_FOUND。
  • HitTest (self, point):返回位于point上的项,如果没有项位于point上,则返回NOT_FOUND。
  • InsertItems(selfitemspos):在指定位置之前插入给定数量的字符串。
  • IsSelected(selfn):确定是否选择某项。
  • IsSorted(self):如果列表框为LB_SORT样式,则返回True。此方法主要仅用于内部使用。
  • SetFirstItem (self, string):将指定的项设置为第一个可见项。
  • SetItemBackgroundColour(selfitemc):如果wx.LB_OWNERDRAW标志被设置,在列表框中设置一个项的背景颜色(仅对MSW有效)。
  • SetItemFont(selfitemf):如果wx.LB_OWNERDRAW标志被设置,在列表框中设置一个项的前景颜色(仅对MSW有效)。
  • SetSelection(selfn):将选定项设置为给定项n,如果n == NOT_FOUND则完全删除选定项。注意,这不会触发任何命令事件,也不会取消控件中支持多个选择的任何其他项。
  • SetString(selfnstring):为给定的项设置标签。

图1:wx.ListBox类继承关系

二、wx.ListBox演示

#列表框(wx.ListBox)

import wx

class SampleListBox(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleListBox, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        #设置标题
        self.SetTitle("实战wxPython: ListBox演示")
        #设置窗口尺寸
        self.SetSize(400, 240)

        panel = wx.Panel(self)

        #水平布局
        hbox = wx.BoxSizer(wx.HORIZONTAL)

        # 添加一个列表框
        self.listbox = wx.ListBox(panel)
        hbox.Add(self.listbox, wx.ID_ANY, wx.EXPAND | wx.ALL, 20)

        # 按钮面板
        btnPanel = wx.Panel(panel)
        vbox = wx.BoxSizer(wx.VERTICAL)
        newButon = wx.Button(btnPanel, wx.ID_ANY, "新建", size = (90, 30))
        renButton = wx.Button(btnPanel, wx.ID_ANY, "重命名", size = (90, 30))
        delButton = wx.Button(btnPanel, wx.ID_ANY, "删除", size = (90, 30))
        clrButton = wx.Button(btnPanel, wx.ID_ANY, "清理", size = (90, 30))

        newButon.Bind(wx.EVT_BUTTON, self.NewItem)
        renButton.Bind(wx.EVT_BUTTON, self.OnRename)
        delButton.Bind(wx.EVT_BUTTON, self.OnDelete)
        clrButton.Bind(wx.EVT_BUTTON, self.OnClear)
        self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnRename)

        vbox.Add((-1, 20)) #距离顶端20像素
        vbox.Add(newButon)
        vbox.Add(renButton, 0, wx.TOP, 5)
        vbox.Add(delButton, 0, wx.TOP, 5)
        vbox.Add(clrButton, 0, wx.TOP, 5)

        btnPanel.SetSizer(vbox)
        hbox.Add(btnPanel, 0.6, wx.EXPAND | wx.RIGHT, 20)
        panel.SetSizer(hbox)

        self.Centre()

    def NewItem(self, e):
        text = wx.GetTextFromUser("输入一个新项", "插入对话框")
        if text != "":
            self.listbox.Append(text)

    def OnRename(self, e):
        sel = self.listbox.GetSelection()
        text = self.listbox.GetString(sel)
        renamed = wx.GetTextFromUser("项重命名", "重命名对话框", text)

        if renamed != "":
            self.listbox.Delete(sel)
            item_id = self.listbox.Insert(renamed, sel)
            self.listbox.SetSelection(item_id)

    def OnDelete(self, e):
        sel = self.listbox.GetSelection()
        if sel != -1:
            self.listbox.Delete(sel)

    def OnClear(self, e):
        self.listbox.Clear()

def mAIn():
    app = wx.App()
    sample = SampleListBox(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

这个例子展示了如何从wx.ListBox中添加、修改和删除项。

self.listbox = wx.ListBox(panel)
 hbox.Add(self.listbox, wx.ID_ANY, wx.EXPAND | wx.ALL, 20)

创建一个空的wx.ListBox。设置列表框边框距离20px。

self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnRename)

绑定wx. EVT_LISTBOX_DCLICK事件到方法OnRename(),这样,如果双击列表框中的特定元素,就会显示重命名对话框。

def NewItem(self, e):
        text = wx.GetTextFromUser("输入一个新项", "插入对话框")
        if text != "":
            self.listbox.Append(text)

通过单击新建按钮调用NewItem()方法。在NuwItem方法中,使用包装器wx.GetTextFromUser()方法显示一个wx.TextEntryDialog。将对话框中输入的文本返回给文本变量。如果文本不是空的,我们用append()方法将它添加到列表框中。

if renamed != "":
       self.listbox.Delete(sel)
       item_id = self.listbox.Insert(renamed, sel)
       self.listbox.SetSelection(item_id)

通过删除项并在同一位置插入新项来重命名项。将选择设置回已修改的项。

def OnDelete(self, e):
        sel = self.listbox.GetSelection()
        if sel != -1:
            self.listbox.Delete(sel)

要删除一个项,通过调用GetSelection()方法找到所选项的索引。然后使用delete()方法删除该项。

def OnClear(self, e):
        self.listbox.Clear()

调用Clear()方法清除整个列表框。

图2:wx.ListBox演示

三、wx.CheckListBox复选列表框

wx.CheckListBox是wx.ListBox的派生类,继承了它的功能,它在每个选项上额外显示一个复选框。

wx.CheckListBox发出的事件:

  • EVT_CHECKLISTBOX:当选中或取消选中复选框中的项时,处理wx.EVT_CHECKLISTBOX事件。

wx.CkeckListBox常用方法:

  • Check(selfitemcheck=True):设置给定的项的选择状态。调用此方法不会导致触发wx.EVT_CHECKLISTBOX事件。
  • GetCheckedItems(self):根据IsChecked返回与控件中已选择项对应的整数序列。
  • GetCheckedStrings(self):根据GetChecked返回与控件的已选择项对应的字符串元组。
  • GetSelections(self):返回当前选定项的索引列表。
  • IsChecked(selfitem):如果选中给定项则返回True,否则返回False。
  • SetCheckedItems(selfindexes):如果在索引序列中找到项的索引,则设置项的已选定状态。
  • SetCheckedStrings(selfstrings):如果在字符串序列中找到项的字符串,则设置项的选定状态。

图3:wx.CheckListBox类继承关系

将节二中的演示代码:

self.listbox = wx.ListBox(panel)

修改成

self.listbox = wx.CheckListBox(panel)

运行,就可以演示使用wx.CheckListBox,效果如图4:

图4:wx.CheckListBox演示

四、本文知识点

  • 了解和使用wx.ListBox。
  • 了解和使用wx.CheckListBox。


Tags:wxPython   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
wxPython开发速成:学习这些技巧几乎可以做出任何GUI程序!
下面是Python wxPython的教程,主要包括wxPython的基本概念、窗口、组件、布局、事件处理和样式等方面的内容。 wxPython的基本概念wxPython是Python中的GUI编程库,用于创建图...【详细内容】
2023-05-15  Search: wxPython  点击:(359)  评论:(0)  加入收藏
wxPython -高级控件之列表框ListBox
实战wxPython系列-039 wxPythontigo提供了一些高级控件。例如,树形控件、HTML窗口、网格控件、列表控件、或具有高级样式功能的编辑器等。一、wx.ListBox列表框wx.ListBox列...【详细内容】
2023-02-27  Search: wxPython  点击:(442)  评论:(0)  加入收藏
Python大佬手把手教你用wxPython模块编写界面程序
wxPython是一个开发桌面端图形界面的跨平台函数库,开发语言为Python,它是基于C++的函数库wxWidgets的封装。私信小编01即可获取Python学习资料wxpython有大量组件,它们可以从逻...【详细内容】
2020-09-28  Search: wxPython  点击:(269)  评论:(0)  加入收藏
▌简易百科推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Go语言进阶学习  微信公众号  Tags:Python   点击:(3)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Go语言进阶学习    Tags:Python   点击:(2)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Python技术    Tags:Python   点击:(8)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Python技术  微信公众号  Tags:Python   点击:(17)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Python都知道  微信公众号  Tags:Python   点击:(33)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  子午Python  微信公众号  Tags:Python技巧   点击:(34)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  编程技术汇    Tags:Python代码   点击:(35)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Python学研大本营  微信公众号  Tags:PyCharm插件   点击:(87)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  科学随想录  微信公众号  Tags:Graphlib库   点击:(88)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  大雷家吃饭    Tags:Python   点击:(59)  评论:(0)  加入收藏
站内最新
站内热门
站内头条