<返回更多

wxPython -高级控件之列表框ListBox

2023-02-27    爱好史地的coder
加入收藏

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

 

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

一、wx.ListBox列表框

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

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

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

wx.ListBox支持的窗口样式:

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

wx.ListBox发出的事件:

wx.ListBox常用方法

图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发出的事件:

wx.CkeckListBox常用方法:

图3:wx.CheckListBox类继承关系

将节二中的演示代码:

self.listbox = wx.ListBox(panel)

修改成

self.listbox = wx.CheckListBox(panel)

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

图4:wx.CheckListBox演示

四、本文知识点

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>