<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # wxPython 中的高級小部件 > 原文: [http://zetcode.com/wxpython/advanced/](http://zetcode.com/wxpython/advanced/) 在本章中,我們討論以下高級小部件:`wx.ListBox`,`wx.html.HtmlWindow`和`wx.ListCtrl`。 wxPython 有幾個眾所周知的高級小部件。 例如,樹小部件,HTML 窗口,網格小部件,列表框小部件,列表小部件或具有高級樣式功能的編輯器。 ## `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` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we create a wx.ListBox widget. author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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() ``` 該示例顯示了如何從`wx.ListBox`添加,修改和刪除項目。 ```py self.listbox = wx.ListBox(panel) hbox.Add(self.listbox, wx.ID_ANY, wx.EXPAND | wx.ALL, 20) ``` 我們創建一個空的`wx.ListBox`。 我們在列表框周圍放置了 20px 的邊框。 ```py self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnRename) ``` 我們使用`wx.EVT_LISTBOX_DCLICK`事件綁定器將`wx.EVT_COMMAND_LISTBOX_DOUBLE_CLICKED`事件類型與`OnRename()`方法綁定。 這樣,如果我們雙擊列表框中的特定元素,我們將顯示一個重命名對話框。 ```py def NewItem(self, event): text = wx.GetTextFromUser('Enter a new item', 'Insert dialog') if text != '': self.listbox.Append(text) ``` 我們通過單擊“新建”按鈕來調用`NewItem()`方法。 此方法使用包裝器`wx.GetTextFromUser()`方法顯示`wx.TextEntryDialog`。 我們輸入的文本將返回到`text`變量。 如果文本不為空,則使用`Append()`方法將其附加到列表框。 ```py if renamed != '': self.listbox.Delete(sel) item_id = self.listbox.Insert(renamed, sel) self.listbox.SetSelection(item_id) ``` 我們通過刪除項目并在同一位置插入新項目來重命名該項目。 我們還將選擇重新設置為修改后的項目。 ```py def OnDelete(self, event): sel = self.listbox.GetSelection() if sel != -1: self.listbox.Delete(sel) ``` 要刪除項目,我們通過調用`GetSelection()`方法找到所選項目的索引。 然后,我們使用`Delete()`方法刪除該項目。 `Delete()`方法的參數是所選索引。 ```py def OnClear(self, event): self.listbox.Clear() ``` 最簡單的方法是清除整個列表框。 我們只需調用`Clear()`方法。 ![wx.ListBox widget](https://img.kancloud.cn/dd/71/dd71b4975361a8fc86942635c5e3c4aa_400x250.jpg) 圖:`wx.ListBox`小部件 ## `wx.html.HtmlWindow`小部件 `wx.html.HtmlWindow`小部件顯示 HTML 頁面。 它不是完整的瀏覽器。 我們可以使用`wx.html.HtmlWindow`小部件來做一些有趣的事情。 例如,在下面的程序中,我們創建一個顯示基本統計信息的窗口。 `page.html` ```py <!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` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we create a wx.html.HtmlWindow widget. author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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('newt.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 | wx.ALIGN_RIGHT) 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() ``` 該示例在`wx.html.HtmlWindow`小部件中分配 HTML 文件。 ```py htmlwin = wx.html.HtmlWindow(panel, wx.ID_ANY, style=wx.NO_BORDER) htmlwin.SetStandardFonts() htmlwin.LoadPage("page.html") ``` `wx.html.HtmlWindow`已創建。 HTML 文件使用`LoadPage()`方法加載。 ![](https://img.kancloud.cn/c7/d2/c7d260ecae024579e17f6025b2da3458_427x293.jpg) 圖:`wx.html.HtmlWindow`示例 ## 幫助窗口 我們可以使用`wx.html.HtmlWindow`在我們的應用中提供幫助。 我們可以創建一個獨立的窗口,也可以創建將成為應用一部分的窗口。 以下腳本將使用后一種想法創建一個幫助窗口。 `helpwindow.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we create a help window window with wx.html.HtmlWindow. author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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('exit.png')) toolbar.AddTool(2, 'Help', wx.Bitmap('help.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('closebutton.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('help.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() ``` 幫助窗口一開始是隱藏的。 我們可以通過點擊工具欄上的幫助按鈕或按 `F1` 表現出來。 幫助窗口出現在應用的右側。 要隱藏的幫助窗口,我們點擊關閉按鈕。 ```py self.splitter.SplitVertically(self.panelLeft, self.panelRight) self.splitter.Unsplit() ``` 我們創建左面板和右面板并將其垂直拆分。 之后,我們調用`Unsplit()`方法。 默認情況下,該方法隱藏右側或底部窗格。 我們將右側面板分為兩部分。 面板的標題和主體。 標頭是已調整的`wx.Panel`。 標題由靜態文本和位圖按鈕組成。 我們將`wx.html.Window`放入面板的主體中。 ```py 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`。 背景顏色設置為標題面板的顏色。 這樣做是為了使按鈕顯示為標題的一部分。 ```py helpWin = html.HtmlWindow(self.panelRight, style=wx.NO_BORDER) helpWin.LoadPage('help.html') ``` 我們在右側面板上創建一個`wx.html.HtmlWindow`小部件。 我們的 HTML 代碼位于單獨的文件中。 這次我們調用`LoadPage()`方法來獲取 HTML 代碼。 ```py self.panelLeft.Bind(wx.EVT_KEY_DOWN, self.OnKeyPressed) self.panelLeft.SetFocus() ``` 我們將重點放在左側面板上。 我們可以使用`F1`鍵啟動幫助窗口。 為了使用鍵盤控制窗口,必須具有焦點。 如果未設置焦點,則必須首先單擊面板,然后才能通過按 `F1` 鍵啟動幫助窗口。 ```py def OnHelp(self, e): self.splitter.SplitVertically(self.panelLeft, self.panelRight) self.panelLeft.SetFocus() ``` 為了顯示幫助窗口,我們調用`OnHelp()`方法。 它將垂直拆分兩個面板。 我們一定不要忘記再次設置焦點,因為初始焦點會因拆分而丟失。 以下是我們在應用中加載的 HTML 文件。 `help.html` ```py <!DOCTYPE html> <html> <body bgcolor="#ababab"> <h4>Table of Contents</h4> <ul> <li><a href="#basic">Basic statistics</a></li> <li><a href="#advanced">Advanced statistics</a></li> <li><a href="#intro">Introducing Newt</a></li> <li><a href="#charts">Working with charts</a></li> <li><a href="#pred">Predicting values</a></li> <li><a href="#neural">Neural networks</a></li> <li><a href="#glos">Glossary</a></li> </ul> <p> <a name="basic"> <h6>Basic Statistics</h6> Overview of elementary concepts in statistics. Variables. Correlation. Measurement scales. Statistical significance. Distributions. Normality assumption. </a> </p> <p> <a name="advanced"> <h6>Advanced Statistics</h6> Overview of advanced concepts in statistics. Anova. Linear regression. Estimation and hypothesis testing. Error terms. </a> </p> <p> <a name="intro"> <h6>Introducing Newt</h6> Introducing the basic functionality of the Newt application. Creating sheets. Charts. Menus and Toolbars. Importing data. Saving data in various formats. Exporting data. Shortcuts. List of methods. </a> </p> <p> <a name="charts"> <h6>Charts</h6> Working with charts. 2D charts. 3D charts. Bar, line, box, pie, range charts. Scatterplots. Histograms. </a> </p> <p> <a name="pred"> <h6>Predicting values</h6> Time series and forecasting. Trend Analysis. Seasonality. Moving averages. Univariate methods. Multivariate methods. Holt-Winters smoothing. Exponential smoothing. ARIMA. Fourier analysis. </a> </p> <p> <a name="neural"> <h6>Neural networks</h6> Overview of neural networks. Biology behind neural networks. Basic artificial Model. Training. Preprocessing. Postprocessing. Types of neural networks. </a> </p> <p> <a name="glos"> <h6>Glossary</h6> Terms and definitions in statistics. </a> </p> </body> </html> ``` HTML 文件包含應用幫助的目錄。 ![](https://img.kancloud.cn/4b/14/4b143b4efcaf84f665db5c69b90e2180_580x372.jpg) 圖:幫助窗口 ## `wx.ListCtrl`小部件 `wx.ListCtrl`是項目列表的圖形表示。 一個`wx.ListBox`只能有一列。 `wx.ListCtrl`可以有多個欄。 `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`的一些基本功能。 `actresses.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we create a simple wx.ListCtrl widget. author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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() ``` 該代碼示例在`wx.ListCtrl`中顯示有關女演員的數據。 ```py self.list = wx.ListCtrl(panel, wx.ID_ANY, style=wx.LC_REPORT) ``` 我們用`wx.LC_REPORT`樣式創建一個`wx.ListCtrl`。 ```py self.list.InsertColumn(0, 'name', width=140) self.list.InsertColumn(1, 'place', width=130) self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90) ``` 我們插入三列。 我們可以指定列的`width`和列的`format`。 默認格式為`wx.LIST_FORMAT_LEFT`。 ```py 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()`方法將數據添加到當前行的連續列中。 ### Mixin Mixins 是進一步增強`wx.ListCtrl`函數的類。 它們位于`wx.lib.mixins.listctrl`模塊中。 為了使用它們,我們必須從這些類繼承。 有六個 mixin: * `wx.ColumnSorterMixin` * `wx.ListCtrlAutoWidthMixin` * `wx.ListCtrlSelectionManagerMix` * `wx.TextEditMixin` * `wx.CheckListCtrlMixin` * `wx.ListRowHighlighter` `wx.ColumnSorterMixin`是一個混合器,可以對報表視圖中的列進行排序。 `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` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we use wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin with a wx.ListBox. author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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() ``` 我們稍微改變前面的示例。 ```py import wx.lib.mixins.listctrl ``` 在這里,我們導入 mixin 模塊。 ```py 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.ListCtrl`和`wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin`繼承。 這稱為多重繼承。 最后一列將自動調整大小以占據`wx.ListCtrl`的剩余寬度。 ### `wx.lib.mixins.listctrl.ColumnSorterMixin` 以下示例創建可排序的列。 如果單擊列標題,則會對列中的相應行進行排序。 `sorted.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we create sortable columns with wx.lib.mixins.listctrl.ColumnSorterMixin author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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() ``` 我們將再次在女演員中使用該示例。 ```py wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self, len(actresses)) ``` `wx.lib.mixins.listctrl.ColumnSorterMixin`接受一個參數:要排序的列數。 ```py self.itemDataMap = actresses ``` 我們必須將要顯示在列表控件中的數據映射到`itemDataMap`屬性。 數據必須為字典數據類型。 ```py def GetListCtrl(self): return self ``` 我們必須創建一個`GetListCtrl()`方法。 此方法返回將要排序的`wx.ListCtrl`小部件。 ```py self.list.SetItemData(index, key) ``` 我們必須將每行與一個特殊索引相關聯。 這是通過`SetItemData`方法完成的。 ## `wx.lib.mixins.listctrl.CheckListCtrl` 可以在列表控件內放置一個復選框。 在 wxPython 中,我們可以使用`wx.lib.mixins.listctrl.CheckListCtrl`。 `repository.py` ```py #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ZetCode wxPython tutorial In this example, we create a check list control widget. author: Jan Bodnar website: www.zetcode.com last modified: May 2018 """ 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() ``` 該示例使用`wx.lib.mixins.listctrl.CheckListCtrl`創建倉庫 UI。 ```py 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) ``` 我們從三個不同的類繼承。 ```py def OnSelectAll(self, event): num = self.list.GetItemCount() for i in range(num): self.list.CheckItem(i) ``` `OnSelectAll()`方法選擇所有復選框。 `GetItemCount()`確定項目數,`CheckItem()`方法標記當前復選框。 ![](https://img.kancloud.cn/58/2f/582f485dca6b19cdc354013fa188a0ce_595x392.jpg) 圖:存儲庫 在 wxPython 教程的這一部分中,我們介紹了幾個高級小部件,包括`wx.ListBox`,`wx.html.HtmlWindow`和`wx.ListCtrl`。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看