构建列表控件与管理项目
立即解锁
发布时间: 2025-08-17 02:04:05 阅读量: 1 订阅数: 5 

### 构建列表控件与管理项目
#### 1. 图像列表与列表控件关联
在处理列表控件时,图像列表是一个重要的元素。图像列表有几种绘制模式,如 `wx.IMAGELIST_DRAW_NORMAL`、`wx.IMAGELIST_DRAW_TRANSPARENT`、`wx.IMAGELIST_DRAW_SELECTED` 和 `wx.IMAGELIST_DRAW_FOCUSED`。若 `solidBackground` 为 `True`,绘制方法会使用一种更快的算法,但该算法仅适用于纯色背景。
创建图像列表后,需要将其关联到列表控件上,可使用以下两种方法:
- `AssignImage(imageList, which)`
- `SetImage(imageList, which)`
这两种方法的参数相同,第一个参数是图像列表,第二个参数是一个整数值,取值为 `wx.IMAGE_LIST_NORMAL` 或 `wx.IMAGE_LIST_SMALL`。它们的区别在于在 C++ 端对图像列表的管理方式:
- `AssignImage()`:图像列表成为列表控件的一部分,当列表控件被销毁时,图像列表也会被销毁。
- `SetImage()`:图像列表有独立的生命周期,列表控件销毁时,图像列表不会自动销毁,而是在 Python 对象超出作用域时被处理。
列表控件可以关联两个图像列表:
- 普通图像列表(使用 `wx.IMAGE_LIST_NORMAL` 关联)用于常规图标模式显示。
- 小图像列表(使用 `wx.IMAGE_LIST_SMALL` 关联)用于报表和小图标模式。
多数情况下,只需添加一个图像列表,但如果希望列表以多种模式显示,就需要提供两个列表,且两个图像列表的索引必须一一对应。
此外,还有一个获取图像列表的方法 `GetImageList(which)`,它返回与传入标志关联的图像列表。
#### 2. 列表项的添加与删除
在显示列表之前,需要向其中添加文本信息。在图标列表中,可以添加图标、字符串或两者兼具的新项;在报表视图中,设置初始图标和/或字符串后,还可以为行中的不同列设置信息。
##### 2.1 添加新行
添加新行可使用 `InsertItem()` 系列方法,具体使用哪种取决于插入项的类型:
- `InsertStringItem(index, label)`:仅插入字符串时使用,`index` 是列表中显示新项的行索引。
- `InsertImageItem(index, imageIndex)`:仅插入图像时使用,第一个 `index` 是列表控件中的行索引,`imageIndex` 是关联图像列表中的索引。插入图像项前,必须先创建并关联图像列表,若 `imageIndex` 超出图像列表范围,将显示空白图像。
- `InsertImageStringItem(index, label, imageIndex)`:添加既有图像又有字符串标签的项时使用,参数综合了前两种方法。
- `InsertItem(index, item)`:`item` 是 `wx.ListItem` 类的实例。
##### 2.2 添加列
在报表模式下的列表控件中添加列,可使用 `InsertColumn()` 方法:
```python
InsertColumn(col, heading, format=wx.LIST_FORMAT_LEFT, width=-1)
```
- `col`:新列在列表中的索引。
- `heading`:列标题文本。
- `format`:列中文本的对齐方式,可取值 `wx.LIST_FORMAT_CENTRE`、`wx.LIST_FORMAT_LEFT` 或 `wx.LIST_FORMAT_RIGHT`。
- `width`:列的初始显示宽度(像素),用户可通过拖动列标题边缘更改。
还有一个 `InsertColumnInfo(info)` 方法,可使用 `wx.ListItem` 对象设置列。
##### 2.3 设置多列列表中的值
前面的行方法仅设置多列报表列表的初始列,要设置其他列的字符串,可使用 `SetStringItem()` 方法:
```python
SetStringItem(index, col, label, imageId=-1)
```
- `index` 和 `col`:要设置的单元格的行和列索引。
- `label`:单元格中显示的文本。
- `imageId`:关联图像列表中的索引,用于在单元格中显示图像。
`SetStringItem()` 是 `SetItem(info)` 方法的特殊情况,`SetItem(info)` 接受一个 `wx.ListItem` 实例。还可使用 `GetItem(index, col=0)` 方法获取单元格的 `wx.ListItem` 实例。
##### 2.4 项的属性
有许多获取和设置项部分属性的方法,这些方法大多作用于行的第一列。若要访问其他列,可能需要使用 `GetItem()` 获取整个项,再使用项类的获取和设置方法。
- `SetItemImage(item, image, selImage)`:设置项的图像,`item` 是项在列表中的索引,`image` 和 `selImage` 分别是常规图像和选中时图像在图像列表中的索引。
- `GetItemText(item)` 和 `SetItemText(item, text)`:获取或设置项的文本。
- `GetItemState(item, stateMask)` 和 `SetItemState(item, state, stateMask)`:获取或设置项的状态,`state` 和 `stateMask` 的取值如下表所示:
| State | Description |
| --- | --- |
| wx.LIST_STATE_CUT | 项正在被剪切,仅在 MS Windows 下可用 |
| wx.LIST_STATE_DONTCARE | 状态无关紧要,仅在 MS Windows 下可用 |
| wx.LIST_STATE_DROPHILITED | 项因拖放操作接收放下而高亮显示,仅在 MS Windows 下可用 |
| wx.LIST_STATE_FOCUSED | 项具有光标焦点 |
| wx.LIST_STATE_SELECTED | 项当前被选中 |
- `GetColumn(col)`:返回指定索引列的 `wx.ListItem` 实例(即列标题项)。
- `SetColumn(col, item)`:设置已添加的列。
- `GetColumnWidth(col)`:以像素为单位返回列的宽度,仅适用于报表模式列表。
- `SetColumnWidth(col, width)`:设置列的宽度,`width` 可以是整数值,也可以是 `wx.LIST_AUTOSIZE`(将宽度设置为最长项的宽度)或 `wx.LIST_AUTOSIZE_USEHEADER`(将宽度设置为标题文本的宽度)。
还可以使用 `GetColumnCount()` 获取列表中定义的列数,`GetItemCount()` 获取行数;若列表处于列表模式,`GetCountPerPage()` 返回每列中的项数。
删除项可使用 `DeleteItem(item)`,传入项在列表中的索引;若要一次性删除所有项,可使用 `DeleteAllItems()` 或 `ClearAll()`;删除列可使用 `DeleteColumn(col)`,传入列的索引。
#### 3. 响应用户操作
列表控件的一个重要功能是在用户选择列表中的项时做出响应。
##### 3.1 响应列表项选择
列表控件会响应各种用户操作触发事件,可使用 `Bind()` 方法为这些事件设置处理程序。所有事件处理程序都会接收一个 `wx.ListEvent` 实例,它是 `wx.CommandEvent` 的子类。`wx.ListEvent` 有一些特定的获取方法,部分属性仅对特定事件类型有效,所有事件类型共有的属性如下表所示:
| Property | Description |
| --- | --- |
| GetData() | 与事件列表项关联的用户数据项 |
| GetKeyCode() | 在按键事件中,按下键的键码 |
| GetIndex() | 受影响项在列表中的索引 |
| GetItem() | 受事件影响的实际 `wx.ListItem` |
| GetImage() | 受事件影响的单元格中的图像 |
| GetMask() | 受事件影响的单元格中的位掩码 |
| GetPoint() | 事件的实际鼠标位置 |
| GetText() | 受事件影响的单元格中的文本 |
列表项选择相关的事件类型如下表所示:
| Event Type | Description |
| --- | --- |
| EVT_LIST_BEGIN_DRAG | 用户用左键开始拖动操作时触发 |
| EVT_LIST_BEGIN_RDRAG | 用户用右键开始拖动操作时触发 |
| EVT_LIST_DELETE_ALL_ITEMS | 调用列表的 `DeleteAll()` 方法时触发 |
| EVT_LIST_DELETE_ITEM | 调用列表的 `Delete()` 方法时触发 |
| EVT_LIST_INSERT_ITEM | 向列表中插入项时触发 |
| EVT_LIST_ITEM_ACTIVATED | 用户选中项时按回车键或双击激活项时触发 |
| EVT_LIST_ITEM_DESELECTED | 项失去用户选择时触发 |
| EVT_LIST_ITEM_FOCUSED | 具有焦点的项改变时触发 |
| EVT_LIST_ITEM_MIDDLE_CLICK | 鼠标中键点击列表时触发 |
| EVT_LIST_ITEM_RIGHT_CLICK | 鼠标右键点击列表时触发 |
| EVT_LIST_ITEM_SELECTED | 用左键选择项时触发 |
| EVT_LIST_ITEM_KEY_DOWN | 列表控件具有焦点时按键触发 |
##### 3.2 响应列标题选择
除了列表主体中的用户事件触发的事件外,报表列表控件的列标题中的用户活动也会触发事件。列事件创建的 `wx.ListEvent` 对象有一个额外的属性 `GetColumn()`,返回事件发生列的索引。列事件类型如下表所示:
| Event Type | Description |
| --- | --- |
| EVT_LIST_COL_BEGIN_DRAG | 用户开始拖动列边框时触发 |
| EVT_LIST_COL_CLICK | 点击列标题内部时触发 |
| EVT_LIST_COL_RIGHT_CLICK | 右键点击列标题内部时触发 |
| EVT_LIST_COL_END_DRAG | 用户完成列边框拖动时触发 |
下面是一个示例代码,展示了多种列表事件和属性的使用:
```python
import wx
import sys, glob, random
import data
class DemoFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1,
"Other wx.ListCtrl Stuff",
size=(700,5
```
0
0
复制全文
相关推荐










