- wxPython 教程
- wxPython - 首頁
- wxPython - 簡介
- wxPython - 環境配置
- wxPython - Hello World
- wxPython - GUI 構建工具
- wxPython - 主要類
- wxPython - 事件處理
- wxPython - 佈局管理
- wxPython - 按鈕
- wxPython - 可停靠視窗
- 多文件介面
- wxPython - 繪圖 API
- wxPython - 拖放操作
- wxPython 資源
- wxPython - 快速指南
- wxPython - 有用資源
- wxPython - 討論
wxPython - ListBox & ListCtrl 類
wx.ListBox 小部件呈現一個垂直可滾動的字串列表。預設情況下,列表中只能選擇一個專案。但是,它可以自定義為多選。
ListCtrl 小部件是一個高度增強的列表顯示和選擇工具。在報表檢視、列表檢視或圖示檢視中可以顯示多個列的列表。
ListBox 建構函式具有以下定義:
Wx.ListBox(parent, id, pos, size, choices, style)
Choices 引數是用於填充列表的字串列表。
wx.ListBox 物件可以使用以下樣式引數進行自定義:
| 序號 | 引數 & 描述 |
|---|---|
| 1 | wxLB_SINGLE 單選列表 |
| 2 | wxLB_MULTIPLE 多選列表:使用者可以切換多個專案的選中狀態 |
| 3 | wxLB_EXTENDED 擴充套件選擇列表 - 使用者可以透過使用 SHIFT 或 CTRL 鍵以及游標移動鍵或滑鼠來擴充套件選擇範圍 |
| 4 | wxLB_HSCROLL 如果內容過寬,則建立水平捲軸 |
| 5 | wxLB_ALWAYS_SB 始終顯示垂直捲軸 |
| 6 | wxLB_NEEDED_SB 僅在需要時建立垂直捲軸 |
| 7 | wxLB_SORT 列表框內容按字母順序排序 |
wx.ListBox 類方法:
| 序號 | 方法 & 描述 |
|---|---|
| 1 | DeSelect() 取消選擇列表框中的一個專案 |
| 2 | InsertItem() 在指定位置插入給定的字串 |
| 3 | SetFirstItem() 將給定索引處的字串設定為列表中的第一個 |
| 4 | IsSorted() 如果使用了 wxzL?B_SORT 樣式,則返回 true |
| 5 | GetString() 返回選定索引處的字串 |
| 6 | SetString() 設定給定索引處專案的標籤 |
EVT_LISTBOX 繫結器在列表中的某個專案被選中或程式化地更改選擇時觸發處理程式。當列表框專案上發生雙擊事件時,由 EVT_LISTBOX_DCLICK 繫結的處理程式函式被呼叫。
示例
在以下示例中,ListBox 控制元件和 TextCtrl 物件分別放置在水平框調整器左側和右側部分。ListBox 使用 languages[] 列表物件中的字串填充。
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript','PHP','VB.NET','C#'] self.text = wx.TextCtrl(panel,style = wx.TE_MULTILINE) lst = wx.ListBox(panel, size = (100,-1), choices = languages, style = wx.LB_SINGLE)
兩個物件放置在水平框調整器中。
box = wx.BoxSizer(wx.HORIZONTAL) box.Add(lst,0,wx.EXPAND) box.Add(self.text, 1, wx.EXPAND)
ListBox 控制元件使用 EVT_LISTBOX 繫結器連結到 onListBox() 處理程式。
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
處理程式將選定的字串追加到右側的多行 TextCtrl 中。
def onListBox(self, event):
self.text.AppendText( "Current selection: "+
event.GetEventObject().GetStringSelection() + "\n")
完整程式碼如下:
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (350,300))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.HORIZONTAL)
self.text = wx.TextCtrl(panel,style = wx.TE_MULTILINE)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#']
lst = wx.ListBox(panel, size = (100,-1), choices = languages, style = wx.LB_SINGLE)
box.Add(lst,0,wx.EXPAND)
box.Add(self.text, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Centre()
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
self.Show(True)
def onListBox(self, event):
self.text.AppendText( "Current selection:
"+event.GetEventObject().GetStringSelection()+"\n")
ex = wx.App()
Mywin(None,'ListBox Demo')
ex.MainLoop()
以上程式碼產生以下輸出:
wx.ListCtrl 是一個增強的,因此更復雜的小部件。ListBox 僅顯示一列,而 ListCtrl 可以包含多列。ListCtrl 小部件的外觀由以下樣式引數控制:
| 序號 | 引數 & 描述 |
|---|---|
| 1 | wx.LC_LIST 多列列表檢視,帶可選的小圖示。列自動計算 |
| 2 | wx.LC_REPORT 單列或多列報表檢視,帶可選的標題 |
| 3 | wx.LC_VIRTUAL 應用程式根據需要提供專案文字。只能與 wxLC_REPORT 一起使用 |
| 4 | wx.LC_ICON 大圖示檢視,帶可選標籤 |
| 5 | wx.LC_SMALL_ICON 小圖示檢視,帶可選標籤 |
| 6 | wx.LC_ALIGN_LEFT 圖示左對齊 |
| 7 | wx.LC_EDIT_LABELS 標籤可編輯 - 應用程式將在編輯開始時收到通知 |
| 8 | wx.LC_NO_HEADER 報表模式下沒有標題 |
| 9 | wx.LC_SORT_ASCENDING 升序排序 |
| 10 | wx.LC_SORT_DESCENDING 降序排序 |
| 11 | wx.LC_HRULES 在報表模式下,在行之間繪製淺色水平線 |
| 12 | wx.LC_VRULES 在報表模式下,在列之間繪製淺色垂直線 |
示例
在以下示例中構造了一個報表檢視中的 ListCtrl 小部件。
self.list = wx.ListCtrl(panel, -1, style = wx.LC_REPORT)
標題列由 InsertColumn() 方法建立,該方法採用列號、標題、樣式和寬度引數。
self.list.InsertColumn(0, 'name', width = 100) self.list.InsertColumn(1, 'runs', wx.LIST_FORMAT_RIGHT, 100) self.list.InsertColumn(2, 'wkts', wx.LIST_FORMAT_RIGHT, 100)
一個元組列表,每個元組包含三個字串,稱為 players[],儲存用於填充 ListCtrl 物件列的資料。
新行以 InsertStringItem() 方法開頭,該方法返回當前行的索引。使用 sys.maxint 會在最後一行之後給出行號。使用該索引,其他列由 SetStringItem() 方法填充。
for i in players: index = self.list.InsertStringItem(sys.maxint, i[0]) self.list.SetStringItem(index, 1, i[1]) self.list.SetStringItem(index, 2, i[2])
該示例的完整程式碼如下:
import sys
import wx
players = [('Tendulkar', '15000', '100'), ('Dravid', '14000', '1'),
('Kumble', '1000', '700'), ('KapilDev', '5000', '400'),
('Ganguly', '8000', '50')]
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title)
panel = wx.Panel(self)
box = wx.BoxSizer(wx.HORIZONTAL)
self.list = wx.ListCtrl(panel, -1, style = wx.LC_REPORT)
self.list.InsertColumn(0, 'name', width = 100)
self.list.InsertColumn(1, 'runs', wx.LIST_FORMAT_RIGHT, 100)
self.list.InsertColumn(2, 'wkts', wx.LIST_FORMAT_RIGHT, 100)
for i in players:
index = self.list.InsertStringItem(sys.maxint, i[0])
self.list.SetStringItem(index, 1, i[1])
self.list.SetStringItem(index, 2, i[2])
box.Add(self.list,1,wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Centre()
self.Show(True)
ex = wx.App()
Mywin(None,'ListCtrl Demo')
ex.MainLoop()
以上程式碼產生以下輸出。球員資料以報表檢視顯示: