关于python:wxpython入门第六步高级组件

4次阅读

共计 17903 个字符,预计需要花费 45 分钟才能阅读完成。

wxpython 高级组件

在这一章中,咱们将探讨以下高级部件:wx.ListBox、wx.html.HtmlWindow、wx.ListCtrl。
wxPython 有几个驰名的高级部件。例如树形组件、HTML 窗口、网格部件、listbox 部件、列表部件或具备高级款式性能的编辑器。

wx.ListBox 组件

wx.ListBox用于显示和解决一个我的项目列表。wx.ListBox能够在两种不同的状态下创立:单选状态或多选状态。单选状态是默认状态。

wx.ListBox中有两个重要事件。第一个是 wx.EVT_COMMAND_LISTBOX_SELECTED 事件。当咱们在 wx.ListBox 中抉择一个我的项目时,就会产生这个事件。第二个是 wx.EVT_COMMAND_LISTBOX_DOUBLE_CLICKED 事件。当咱们双击 wx.ListBox 中的一个我的项目时,就会产生这个事件。元素从零开始编号。如果须要,滚动条会主动显示。

#listbox.py

import wx

class Example(wx.Frame):

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

        self.InitUI()

    def InitUI(self):

        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)
        newBtn = wx.Button(btnPanel, wx.ID_ANY, 'New', size=(90, 30))
        renBtn = wx.Button(btnPanel, wx.ID_ANY, 'Rename', size=(90, 30))
        delBtn = wx.Button(btnPanel, wx.ID_ANY, 'Delete', size=(90, 30))
        clrBtn = wx.Button(btnPanel, wx.ID_ANY, 'Clear', size=(90, 30))

        self.Bind(wx.EVT_BUTTON, self.NewItem, id=newBtn.GetId())
        self.Bind(wx.EVT_BUTTON, self.OnRename, id=renBtn.GetId())
        self.Bind(wx.EVT_BUTTON, self.OnDelete, id=delBtn.GetId())
        self.Bind(wx.EVT_BUTTON, self.OnClear, id=clrBtn.GetId())
        self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnRename)

        vbox.Add((-1, 20))
        vbox.Add(newBtn)
        vbox.Add(renBtn, 0, wx.TOP, 5)
        vbox.Add(delBtn, 0, wx.TOP, 5)
        vbox.Add(clrBtn, 0, wx.TOP, 5)

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

        self.SetTitle('wx.ListBox')
        self.Centre()

    def NewItem(self, event):

        text = wx.GetTextFromUser('Enter a new item', 'Insert dialog')
        if text != '':
            self.listbox.Append(text)

    def OnRename(self, event):

        sel = self.listbox.GetSelection()
        text = self.listbox.GetString(sel)
        renamed = wx.GetTextFromUser('Rename item', 'Rename dialog', text)

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

    def OnDelete(self, event):

        sel = self.listbox.GetSelection()
        if sel != -1:
            self.listbox.Delete(sel)

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


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030141224426.png” alt=”image-20201030141224426″ style=”zoom:50%;” />

本例展现了如何从 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_COMMAND_LISTBOX_DOUBLE_CLICKED 事件绑定器与 OnRename()办法绑定一个 wx.EVT_LISTBOX_DCLICK 事件类型。这样,如果咱们双击列表框中的一个特定元素,咱们就会显示一个重命名对话框。

def NewItem(self, event):

    text = wx.GetTextFromUser('Enter a new item', 'Insert dialog')
    if text != '':
        self.listbox.Append(text)        

咱们通过点击 New 按钮来调用 NewItem()办法。该办法应用包装器 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, event):

    sel = self.listbox.GetSelection()
    if sel != -1:
        self.listbox.Delete(sel)

要删除一个我的项目,咱们通过调用 GetSelection()办法找到所选项目标索引。而后咱们用 Delete()办法删除这个我的项目。Delete()办法的参数是选中的索引。

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

最简略的就是革除整个列表框。咱们只需调用 Clear()办法。

wx.html.HtmlWindow 组件

wx.html.HtmlWindow组件显示 HTML 页面。它不是一个成熟的浏览器。咱们能够用 wx.html.HtmlWindow 组件做一些乏味的事件。

例如,在上面的程序中,咱们创立了一个显示根本统计数据的窗口。

<!--page.html-->
<!DOCTYPE html>
<html>
<body bgcolor="#8e8e95">
  <table cellspacing="5" border="0" width="250">
    <tr width="200" align="left">
    <td bgcolor="#e7e7e7">&nbsp;&nbsp;Maximum</td>
    <td bgcolor="#aaaaaa">&nbsp;&nbsp;<b>9000</b></td>
    </tr>
    <tr align="left">
    <td bgcolor="#e7e7e7">&nbsp;&nbsp;Mean</td>
    <td bgcolor="#aaaaaa">&nbsp;&nbsp;<b>6076</b></td>
    </tr>
    <tr align="left">
    <td bgcolor="#e7e7e7">&nbsp;&nbsp;Minimum</td>
    <td bgcolor="#aaaaaa">&nbsp;&nbsp;<b>3800</b></td>
    </tr>
    <tr align="left">
    <td bgcolor="#e7e7e7">&nbsp;&nbsp;Median</td>
    <td bgcolor="#aaaaaa">&nbsp;&nbsp;<b>6000</b></td>
    </tr>
    <tr align="left">
    <td bgcolor="#e7e7e7">&nbsp;&nbsp;Standard Deviation</td>
    <td bgcolor="#aaaaaa">&nbsp;&nbsp;<b>6076</b></td>
    </tr>
  </table>
</body>
</html>

这是要显示的 HTML 页面。

#htmlwin.py

import wx
import wx.html

class Example(wx.Frame):

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

        self.InitUI()

    def InitUI(self):

        panel = wx.Panel(self)

        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer(wx.HORIZONTAL)

        htmlwin = wx.html.HtmlWindow(panel, wx.ID_ANY, style=wx.NO_BORDER)
        htmlwin.SetStandardFonts()
        htmlwin.LoadPage("page.html")

        vbox.Add((-1, 10), 0)
        vbox.Add(htmlwin, 1, wx.EXPAND | wx.ALL, 9)

        bitmap = wx.StaticBitmap(panel, wx.ID_ANY, wx.Bitmap('icon_1.png'))
        hbox.Add(bitmap, 0, wx.LEFT | wx.BOTTOM | wx.TOP, 10)
        btnOk = wx.Button(panel, wx.ID_ANY, 'Ok')

        self.Bind(wx.EVT_BUTTON, self.OnClose, id=btnOk.GetId())

        hbox.Add((100, -1), 1, wx.EXPAND)
        hbox.Add(btnOk, flag=wx.TOP | wx.BOTTOM | wx.RIGHT, border=10)
        vbox.Add(hbox, 0, wx.EXPAND)

        panel.SetSizer(vbox)

        self.SetTitle('Basic statistics')
        self.Centre()

    def OnClose(self, event):
        self.Close()


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030141835060.png” alt=”image-20201030141835060″ style=”zoom:50%;” />

本例在 wx.html.HtmlWindow widget 中派发一个 HTML 文件。

htmlwin = wx.html.HtmlWindow(panel, wx.ID_ANY, style=wx.NO_BORDER)
htmlwin.SetStandardFonts()
htmlwin.LoadPage("page.html")   

wx.html.HtmlWindow 被创立。用 LoadPage()办法加载 HTML 文件。

Help window

咱们能够应用 wx.html.HtmlWindow 来为咱们的应用程序提供帮忙。咱们能够创立一个独立的窗口,也能够创立一个将成为应用程序一部分的窗口。上面的脚本将应用后者来创立一个帮忙窗口。

# helpwindow.py

import wx
import wx.html as html


class Example(wx.Frame):

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

        self.InitUI()

    def InitUI(self):
        toolbar=self.CreateToolBar()
        toolbar.AddTool(1,'Exit',wx.Bitmap('icon_1.png'))
        toolbar.AddTool(2,'Help',wx.Bitmap('icon_2.png'))
        toolbar.Realize()

        self.splitter=wx.SplitterWindow(self)
        self.panelLeft=wx.Panel(self.splitter,wx.ID_ANY,style=wx.BORDER_SUNKEN)

        self.panelRight=wx.Panel(self.splitter)
        vbox2=wx.BoxSizer(wx.VERTICAL)
        header=wx.Panel(self.panelRight,wx.ID_ANY)

        header.SetBackgroundColour('#6f6a59')
        header.SetForegroundColour('white')

        hbox=wx.BoxSizer(wx.HORIZONTAL)

        st=wx.StaticText(header,wx.ID_ANY,'Help')
        font=st.GetFont()
        font.SetFamily(wx.FONTFAMILY_ROMAN)
        font.SetPointSize(11)
        st.SetFont(font)

        hbox.Add(st,1,wx.TOP | wx.BOTTOM | wx.LEFT,8)

        closeBtn=wx.BitmapButton(header,wx.ID_ANY,wx.Bitmap('icon_3.png',
                                                            wx.BITMAP_TYPE_PNG),style=wx.NO_BORDER)
        closeBtn.SetBackgroundColour('#6f6a59')

        hbox.Add(closeBtn,0,wx.TOP | wx.BOTTOM,8)
        header.SetSizer(hbox)

        vbox2.Add(header,0,wx.EXPAND)

        helpWin=html.HtmlWindow(self.panelRight,style=wx.NO_BORDER)
        helpWin.LoadPage('page.html')

        vbox2.Add(helpWin,1,wx.EXPAND)

        self.panelRight.SetSizer(vbox2)
        self.panelLeft.SetFocus()

        self.splitter.SplitVertically(self.panelLeft,self.panelRight)
        self.splitter.Unsplit()

        self.Bind(wx.EVT_BUTTON,self.CloseHelp,id=closeBtn.GetId())
        self.Bind(wx.EVT_TOOL,self.OnClose,id=1)
        self.Bind(wx.EVT_TOOL,self.OnHelp,id=2)

        self.panelLeft.Bind(wx.EVT_KEY_DOWN,self.OnKeyPressed)
        self.panelLeft.SetFocus()

        self.CreateStatusBar()

        self.SetTitle('Help')
        self.Centre()

    def OnClose(self,e):
        self.Close()

    def OnHelp(self,e):
        self.splitter.SplitVertically(self.panelLeft,self.panelRight)
        self.panelLeft.SetFocus()

    def CloseHelp(self,e):
        self.splitter.Unsplit()
        self.panelLeft.SetFocus()

    def OnKeyPressed(self,e):
        keycode=e.GetKeyCode()
        print(keycode)

        if keycode == wx.WXK_F1:
            self.splitter.SplitVertically(self.panelLeft,self.panelRight)
            self.panelLeft.SetFocus()


def main():
    app=wx.App()
    ex=Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030142310825.png” alt=”image-20201030142310825″ style=”zoom:50%;” />

帮忙窗口在一开始是暗藏的,咱们能够通过点击工具栏上的帮忙按钮或按 F1 键来显示它。咱们能够通过点击工具栏上的 “ 帮忙 “ 按钮或按 F1 键来显示它。帮忙窗口就会呈现在应用程序的右侧。要暗藏帮忙窗口,咱们点击敞开按钮。

self.splitter.SplitVertically(self.panelLeft, self.panelRight)
self.splitter.Unsplit()

咱们创立左面板和右面板,并将它们垂直宰割。之后,咱们调用 Unsplit() 办法。默认状况下,该办法会暗藏右侧或底部面板。

咱们将右面板分为两个局部。头部和面板的主体。头部是一个调整后的 wx.Panel。头部由一个动态文本和一个位图按钮组成。咱们把wx.html.Window 放到面板的主体中。

closeBtn = wx.BitmapButton(header, wx.ID_ANY, wx.Bitmap('closebutton.png',
      wx.BITMAP_TYPE_PNG), style=wx.NO_BORDER)
closeBtn.SetBackgroundColour('#6f6a59')

位图按钮款式设置为 wx.NO_BORDER。背景色彩被设置为题目面板的色彩,这样做是为了使按钮看起来像题目的一部分。这样做的目标是为了使按钮作为头的一部分呈现。

helpWin = html.HtmlWindow(self.panelRight, style=wx.NO_BORDER)
helpWin.LoadPage('page.html')

咱们在右侧面板上创立一个 wx.html.HtmlWindow 小部件。咱们的 HTML 代码在一个独自的文件中。这次咱们调用 LoadPage() 办法来获取 HTML 代码。

self.panelLeft.Bind(wx.EVT_KEY_DOWN, self.OnKeyPressed)
self.panelLeft.SetFocus()

咱们将焦点设置在左侧面板。咱们能够用 F1 键启动帮忙窗口。为了用键盘管制一个窗口,它必须有焦点。如果咱们不设置焦点,咱们就必须先点击面板,只有这样咱们能力用按 F1 键启动帮忙窗口。

def OnHelp(self, e):

    self.splitter.SplitVertically(self.panelLeft, self.panelRight)
    self.panelLeft.SetFocus()

为了显示帮忙窗口,咱们调用 OnHelp()办法。它将两个面板垂直宰割。咱们不要遗记再次设置焦点,因为初始焦点会因为宰割而失落。

wx.ListCtrl 组件

wx.ListCtrl 是一个我的项目列表的图形示意。一个 wx.ListBox 只能有一列,而 wx.ListCtrl 能够有多于一列。例如,一个文件管理器应用 wx.ListCtrl 来显示文件系统中的目录和文件。一个 CD 刻录程序在 wx.ListCtrl 中显示要刻录的文件。

一个 wx.ListCtrl 能够以三种不同的款式应用。列表视图、报告视图或图标视图。这些款式由 wx.ListCtrl 窗口款式管制,wx.LC_REPORT、wx.LC_LIST 和 wx.LC_ICON。

wx.ListCtrl 款式

  • wx.LC_LIST
  • wx.LC_REPORT
  • wx.LC_VIRTUAL
  • wx.LC_ICON
  • wx.LC_SMALL_ICON
  • wx.LC_ALIGN_LEFT
  • wx.LC_EDIT_LABELS
  • wx.LC_NO_HEADER
  • wx.LC_SORT_ASCENDING
  • wx.LC_SORT_DESCENDING
  • wx.LC_HRULES
  • wx.LC_VRULES

wx.ListCtrl 例子

#listctrl_exam.py

import wx

data = [('Jessica Alba', 'Pomona', '1981'), ('Sigourney Weaver', 'New York', '1949'),
  ('Angelina Jolie', 'los angeles', '1975'), ('Natalie Portman', 'Jerusalem', '1981'),
  ('Rachel Weiss', 'London', '1971'), ('Scarlett Johansson', 'New York', '1984')]


class Example(wx.Frame):

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

        self.InitUI()

    def InitUI(self):

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        panel = wx.Panel(self)

        self.list = wx.ListCtrl(panel, wx.ID_ANY, style=wx.LC_REPORT)
        self.list.InsertColumn(0, 'name', width=140)
        self.list.InsertColumn(1, 'place', width=130)
        self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)

        idx = 0

        for i in data:

            index = self.list.InsertItem(idx, i[0])
            self.list.SetItem(index, 1, i[1])
            self.list.SetItem(index, 2, i[2])
            idx += 1

        hbox.Add(self.list, 1, wx.EXPAND)
        panel.SetSizer(hbox)

        self.SetTitle('Actresses')
        self.Centre()


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030142803996.png” alt=”image-20201030142803996″ style=”zoom:50%;” />

该代码示例在 wx.ListCtrl 中显示无关女演员的数据。

self.list = wx.ListCtrl(panel, wx.ID_ANY, style=wx.LC_REPORT)

咱们创立一个具备 wx.LC_REPORT 格调的wx.ListCtrl

self.list.InsertColumn(0, 'name', width=140)
self.list.InsertColumn(1, 'place', width=130)
self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)

咱们插入三列。咱们能够指定列的宽度和列的格局。默认的格局是 wx.LIST_FORMAT_LEFT。

idx = 0

for i in data:

    index = self.list.InsertItem(idx, i[0])
    self.list.SetItem(index, 1, i[1])
    self.list.SetItem(index, 2, i[2])
    idx += 1

咱们应用两个办法将数据插入到 wx.ListCtrl 中。每一行都以 InsertItem() 办法开始。该办法的第一个参数指定了行号。该办法返回行的索引。SetItem()办法将数据增加到以后行的间断列中。

Mixins

Mixins 是进一步加强 wx.ListCtrl 性能的类。它们位于 wx.lib.mixins.listctrl 模块中。为了应用它们,咱们必须继承这些类的性能。

有六个 mixins。

  • wx.ColumnSorterMixin
  • wx.ListCtrlAutoWidthMixin
  • wx.ListCtrlSelectionManagerMix
  • wx.TextEditMixin
  • wx.CheckListCtrlMixin
  • wx.ListRowHighlighter

wx.ColumnSorterMixin是一个可能在报表视图中对列进行排序的 mixin。wx.ListCtrlAutoWidthMixin类能够主动调整最初一列的大小到 wx.ListCtrl 的末端。默认状况下,最初一列不占用残余空间。请看后面的例子。wx.ListCtrlSelectionManagerMix定义了独立于平台的抉择策略。wx.TextEditMixin能够编辑文本。wx.CheckListCtrlMixin为每一行增加一个复选框。这样咱们就能够管制行。咱们能够将每一行设置为选中或不选中。wx.ListRowHighlighter解决 wx.ListCtrl 中交替行的主动背景高亮。

wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin

上面的代码显示了咱们如何应用 wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin

#autowidth.py

import wx
import wx.lib.mixins.listctrl

data = [('Jessica Alba', 'Pomona', '1981'), ('Sigourney Weaver', 'New York', '1949'),
  ('Angelina Jolie', 'Los Angeles', '1975'), ('Natalie Portman', 'Jerusalem', '1981'),
  ('Rachel Weiss', 'London', '1971'), ('Scarlett Johansson', 'New York', '1984')]


class AutoWidthListCtrl(wx.ListCtrl, wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin):

    def __init__(self, parent, *args, **kw):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
        wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin.__init__(self)


class Example(wx.Frame):

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

    def InitUI(self):        

        hbox = wx.BoxSizer(wx.HORIZONTAL)

        panel = wx.Panel(self)

        self.list = AutoWidthListCtrl(panel)
        self.list.InsertColumn(0, 'name', width=140)
        self.list.InsertColumn(1, 'place', width=130)
        self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)

        idx = 0

        for i in data:

            index = self.list.InsertItem(idx, i[0])
            self.list.SetItem(index, 1, i[1])
            self.list.SetItem(index, 2, i[2])
            idx += 1

        hbox.Add(self.list, 1, wx.EXPAND)
        panel.SetSizer(hbox)

        self.SetTitle('Actresses')
        self.Centre()


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030143105149.png” alt=”image-20201030143105149″ style=”zoom:50%;” />

咱们把后面的例子改一下。

import wx.lib.mixins.listctrl

这里咱们导入 mixin 模块。

class AutoWidthListCtrl(wx.ListCtrl, wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin):

    def __init__(self, parent, *args, **kw):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
        wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin.__init__(self)

咱们创立一个新的 AutoWidthListCtrl 类。这个类继承自 wx.ListCtrlwx.lib.mixins.listctrl.ListCtrlAutoWidthMixin。这就是所谓的 多继承 。最初一列会主动调整大小以占用wx.ListCtrl 的残余宽度。

wx.lib.mixins.listctrl.ColumnSorterMixin

上面的例子创立了可排序的列。如果咱们点击列头,列中相应的行就会被排序。

#sorted.py

import wx
import wx.lib.mixins.listctrl

actresses = {1 : ('Jessica Alba', 'Pomona', '1981'),
2 : ('Sigourney Weaver', 'New York', '1949'),
3 : ('Angelina Jolie', 'Los Angeles', '1975'),
4 : ('Natalie Portman', 'Jerusalem', '1981'),
5 : ('Rachel Weiss', 'London', '1971'),
6 : ('Scarlett Johansson', 'New York', '1984')
}


class SortedListCtrl(wx.ListCtrl, wx.lib.mixins.listctrl.ColumnSorterMixin):

    def __init__(self, parent):

        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
        wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self, len(actresses))
        self.itemDataMap = actresses

    def GetListCtrl(self):
        return self
        

class Example(wx.Frame):

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

    def InitUI(self):        

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        panel = wx.Panel(self)

        self.list = SortedListCtrl(panel)
        self.list.InsertColumn(0, 'name', width=140)
        self.list.InsertColumn(1, 'place', width=130)
        self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)

        items = actresses.items()

        idx = 0

        for key, data in items:

            index = self.list.InsertItem(idx, data[0])
            self.list.SetItem(index, 1, data[1])
            self.list.SetItem(index, 2, data[2])
            self.list.SetItemData(index, key)
            idx += 1

        hbox.Add(self.list, 1, wx.EXPAND)
        panel.SetSizer(hbox)

        self.SetTitle('Actresses')
        self.Centre()


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030143320812.png” alt=”image-20201030143320812″ style=”zoom:50%;” />

咱们再以女演员为例。

wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self, len(actresses))

wx.lib.mixins.listctrl.ColumnSorterMixin承受一个参数:要排序的列数。

self.itemDataMap = actresses

咱们必须将咱们要显示在列表控件中的数据映射到 itemDataMap 属性中。数据必须是一个字典数据类型。

def GetListCtrl(self):
    return self

咱们必须创立一个 GetListCtrl()办法。这个办法返回要排序的 wx.ListCtrl 部件。

self.list.SetItemData(index, key)

咱们必须为每一行调配一个非凡的索引。这是通过 SetItemData 办法实现的。

wx.lib.mixins.listctrl.CheckListCtrl

列表控件中能够搁置一个复选框。在 wxPython 中,咱们能够应用wx.lib. mixins.listctrl.CheckListCtrl

#repository.py

import wx
from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin

packages = [('abiword', '5.8M', 'base'), ('adie', '145k', 'base'),
    ('airsnort', '71k', 'base'), ('ara', '717k', 'base'), ('arc', '139k', 'base'),
    ('asc', '5.8M', 'base'), ('ascii', '74k', 'base'), ('ash', '74k', 'base')]

class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):

    def __init__(self, parent):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT |
                wx.SUNKEN_BORDER)
        CheckListCtrlMixin.__init__(self)
        ListCtrlAutoWidthMixin.__init__(self)


class Example(wx.Frame):

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

        panel = wx.Panel(self)

        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer(wx.HORIZONTAL)

        leftPanel = wx.Panel(panel)
        rightPanel = wx.Panel(panel)

        self.log = wx.TextCtrl(rightPanel, style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.list = CheckListCtrl(rightPanel)
        self.list.InsertColumn(0, 'Package', width=140)
        self.list.InsertColumn(1, 'Size')
        self.list.InsertColumn(2, 'Repository')

        idx = 0

        for i in packages:

            index = self.list.InsertItem(idx, i[0])
            self.list.SetItem(index, 1, i[1])
            self.list.SetItem(index, 2, i[2])
            idx += 1

        vbox2 = wx.BoxSizer(wx.VERTICAL)

        selBtn = wx.Button(leftPanel, label='Select All')
        desBtn = wx.Button(leftPanel, label='Deselect All')
        appBtn = wx.Button(leftPanel, label='Apply')

        self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=selBtn.GetId())
        self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=desBtn.GetId())
        self.Bind(wx.EVT_BUTTON, self.OnApply, id=appBtn.GetId())

        vbox2.Add(selBtn, 0, wx.TOP|wx.BOTTOM, 5)
        vbox2.Add(desBtn, 0, wx.BOTTOM, 5)
        vbox2.Add(appBtn)

        leftPanel.SetSizer(vbox2)

        vbox.Add(self.list, 4, wx.EXPAND | wx.TOP, 3)
        vbox.Add((-1, 10))
        vbox.Add(self.log, 1, wx.EXPAND)
        vbox.Add((-1, 10))

        rightPanel.SetSizer(vbox)

        hbox.Add(leftPanel, 0, wx.EXPAND | wx.RIGHT, 5)
        hbox.Add(rightPanel, 1, wx.EXPAND)
        hbox.Add((3, -1))

        panel.SetSizer(hbox)

        self.SetTitle('Repository')
        self.Centre()

    def OnSelectAll(self, event):

        num = self.list.GetItemCount()
        for i in range(num):
            self.list.CheckItem(i)

    def OnDeselectAll(self, event):

        num = self.list.GetItemCount()
        for i in range(num):
            self.list.CheckItem(i, False)

    def OnApply(self, event):

        num = self.list.GetItemCount()

        for i in range(num):

            if i == 0: self.log.Clear()

            if self.list.IsChecked(i):
                self.log.AppendText(self.list.GetItemText(i) + '\n')


def main():

    app = wx.App()
    ex = Example(None)
    ex.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

<img src=”https://mymarkdowm.oss-cn-beijing.aliyuncs.com/markdownimg/image-20201030143806315.png” alt=”image-20201030143806315″ style=”zoom:50%;” />

这个例子用 wx.lib.mixins.listctrl.CheckListCtrl 创立了一个版本库 UI。

class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):

    def __init__(self, parent):
        wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT |
                wx.SUNKEN_BORDER)
        CheckListCtrlMixin.__init__(self)
        ListCtrlAutoWidthMixin.__init__(self)

咱们从三个不同的类中继承。

def OnSelectAll(self, event):
   
    num = self.list.GetItemCount()
    
    for i in range(num):
        self.list.CheckItem(i)

OnSelectAll()办法抉择所有的复选框。GetItemCount()确定项数,CheckItem()办法标记以后复选框。

正文完
 0