wxPython 实践(五)高级控件

wxPython 实践(一)概述
wxPython 实践(二)基础控件
wxPython 实践(三)页面布局
wxPython 实践(四)事件响应
wxPython 实践(五)高级控件
wxPython 实践(六)对话框
wxPython 实践(七)GDI 介绍
wxPython 实践(八)其他


官网
https://docs.wxpython.org/wx.1moduleindex.html
https://www.w3ccoo.com/wxpython/wxpython_major_classes.html
系列文章:
https://wintel.blog.csdn.net/?type=blog

1. wx.ComboCtrl 结合文本框和下拉列表

https://wxpython.org/Phoenix/docs/html/wx.ComboCtrl.html
https://cloud.tencent.com/developer/ask/sof/112964185

  1. ComboCtrl 需要用到 ComboPopup
  2. ComboCtrl 需要用 SetPopupControl() 指定关联的 ComboPopup
  3. ComboPopup 用的 GetControl() 必须实现
  4. ComboPopup 中文档说明的其他必须实现的方法
  5. 需要仔细阅读 ComboCtrl 与 ComboPopup 中方法的说明

原文链接:https://blog.csdn.net/leejearl/article/details/7436143

2. Spin 控件族

2.1. wx.SpinButton

wx.SpinButton 有两个上下(或左右)箭头按钮。通常位于文本控件旁边,用于增减值。
窗口样式:

  • wx.SP_HORIZONTAL:指定水平旋转按钮。
  • wx.SP_VERTICAL:指定垂直旋转按钮。
  • wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
  • wx.SP_WRAP:当数值在最小值和最大值处换行。

可发出事件:

  • EVT_SPIN:当按下箭头改变旋转按钮值时生成。
  • EVT_SPIN_UP:当按左/上箭头改变旋转按钮值时生成。
  • EVT_SPIN_DOWN:当按下右/下箭头改变旋转按钮值时生成。

常用方法:

  • GetIncrement(self):返回spin控件的增量值。
  • GetMax(self):返回最大允许值。
  • GetMin(self):返回最小允许值。
  • GetRange(self):返回允许范围。
  • GetValue(self):返回spin按钮的当前值。
  • SetIncrement(self, value):设置spin控件的增量值。
  • SetMax(self, maxVal):设置最大允许值。
  • SetMin(self, minVal):设置最小允许值。
  • SetRange(self, min, max):设置允许范围。
  • SetValue(self, value):设置spin按钮的当前值。

2.2. wx.SpinCtrl

wx.SpinCtrl 是 wx.TextCtrl 和 wx.SpinButton 控件的组合。
当用户点击 wx.SpinButton 的向上或者向下按钮的时候,wx.TextCtrl 中的值将会随之变化。用户也可以直接在 wx.TextCtrl 中输入想要的值。
窗口样式:

  • wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
  • wx.SP_WRAP:当数值在最小值和最大值处换行。
  • wx.TE_PROCESS_ENTER:指示控件应生成wx.EVT_TEXT_ENTER事件。使用这种样式将防止用户在MSW下使用Enter键进行对话框导航(例如激活对话框中的默认按钮)。
  • wx.ALIGN_LEFT:与wx.TextCtrl的wx.TE_LEFT相同:文本向左对齐(这是默认值)。
  • wx.ALIGN_CENTRE_HORIZONTAL:与wx.TextCtrl的wx.TE_CENTRE相同:文本居中。
  • wx.ALIGN_RIGHT:与 wx.TextCtrl的wx.TE_RIGHT相同:文本是右对齐的。

可发出事件:

  • EVT_SPINCTRL:处理wx.EVT_SPINCTRL事件,该事件在spin控件的数值更新时生成。

常用方法:

  • GetBase(self):返回当前使用的进制基数,默认为10。
  • GetIncrement(self):返回spin控件的增量值。
  • GetMax(self):返回最大允许值。
  • GetMin(self):返回最小允许值。
  • GetRange(self):返回允许范围。
  • GetTextValue(self):返回控件的文本输入部分中的文本。
  • GetValue(self):返回spin控件的当前值。
  • SetBase(self, base):设置当前使用的进制基数。
  • SetIncrement(self, value):设置spin控件的增量值。
  • SetMax(self, maxVal):设置最大允许值。
  • SetMin(self, minVal):设置最小允许值。
  • SetRange(self, minVal, maxVal):设置允许范围。
  • SetSelection(self, from_, to_):选择控件文本部分中从(包括)到(不包括)位置之间的文本。
  • SetValue (self, text):设置spin控件的当前值。
  • SetValue (self, value):设置spin控件的当前值。

2.3. wx.SpinCtrlDoule

窗口样式:

  • wx.SP_ARROW_KEYS:用户可以使用方向键来更改数值。
  • wx.SP_WRAP:当数值在最小值和最大值处换行。

可发出的事件:

  • EVT_SPINCTRLDOUBLE:当spin控件的数值发生变化 (即单击向上/向下旋转按钮时,按下ENTER时,或控件失去焦点且新值与上次不同时) 时生成。

常用方法:

  • GetDigits(self):获取spin控件值的精度。
  • GetIncrement(self):返回spin控件的增量值。
  • GetMax(self):返回最大允许值。
  • GetMin(self):返回最小允许值。
  • GetRange(self):返回允许范围。
  • GetTextValue(self):返回控件的文本输入部分中的文本。
  • GetValue(self):返回spin控件的当前值。
  • SetDigits(self, digits):设置spin控件值的精度。
  • SetIncrement(self, value):设置spin控件的增量值。
  • SetMax(self, maxVal):设置最大允许值。
  • SetMin(self, minVal):设置最小允许值。
  • SetRange(self, minVal, maxVal):设置允许范围。
  • SetValue (self, text):设置spin控件的当前值。
  • SetValue (self, value):设置spin控件的当前值。

2.4. 实例

import wx
 
class MyWin(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, title = title) 
        self.SetTitle(title=title)
        panel = wx.Panel(self)
        # 主布局 5行5列
        sizer = wx.GridBagSizer(6, 5)
        # # 标题
        # # 0行0列 占1行2列
        # st1 = wx.StaticText(panel, label="将华氏温度转换为摄氏温度")
        # sizer.Add(st1, pos=(0, 0), span=(1, 2), flag=wx.ALL, border=5)

        # SpinCtrl
        # 1行0列
        st2 = wx.StaticText(panel, label = "华氏度:")
        sizer.Add(st2, pos=(1, 0), flag=wx.ALL|wx.ALIGN_CENTER, border=5)
        # 1行1列
        self.sc = wx.SpinCtrl(panel, value="0", size=(80, 25))
        self.sc.SetRange(-459, 1000)
        sizer.Add(self.sc, pos=(1, 1), flag=wx.ALIGN_CENTER)

        # 回显
        # 2行0列
        st3 = wx.StaticText(panel, label="摄氏度:")
        sizer.Add(st3, pos=(2, 0), flag=wx.ALL|wx.ALIGN_RIGHT, border=5)
        # 2行1列
        self.celsius = wx.StaticText(panel, label="")
        sizer.Add(self.celsius, pos=(2, 1), flag=wx.ALL, border=5)


        # SpinCtrlDouble
        # 3行0列
        st2d = wx.StaticText(panel, label = "华氏度:")
        sizer.Add(st2d, pos=(3, 0), flag=wx.ALL|wx.ALIGN_CENTER, border=5)
        # 3行1列
        self.scd = wx.SpinCtrlDouble(panel, value="0", size=(80, 25))
        self.scd.SetRange(-459, 1000)
        # self.scd.SetDigits(1)
        self.scd.SetIncrement(0.5)
        sizer.Add(self.scd, pos=(3, 1), flag=wx.ALIGN_CENTER)

        # 回显
        # 4行0列
        st3d = wx.StaticText(panel, label="摄氏度:")
        sizer.Add(st3d, pos=(4, 0), flag=wx.ALL|wx.ALIGN_RIGHT, border=5)
        # 4行1列
        self.celsiusd = wx.StaticText(panel, label="")
        sizer.Add(self.celsiusd, pos=(4, 1), flag=wx.ALL, border=5)

        # 5行1列
        computeButton = wx.Button(panel, label="计算")
        computeButton.SetFocus()
        sizer.Add(computeButton, pos=(5, 1), flag=wx.ALIGN_RIGHT|wx.TOP, border=5)
        # 5行2列
        closeButton = wx.Button(panel, label="关闭")
        sizer.Add(closeButton, pos=(5, 2), flag=wx.ALIGN_LEFT|wx.TOP, border=5)
 
        computeButton.Bind(wx.EVT_BUTTON, self.OnCompute)
        closeButton.Bind(wx.EVT_BUTTON, self.OnClose)
 
        panel.SetSizer(sizer)
        self.Centre()
 
    def OnClose(self, e):
        self.Close(True)
 
    def OnCompute(self, e):
        fahr = self.sc.GetValue()
        cels = round((fahr - 32) * 5 / 9.0, 2)
        self.celsius.SetLabel(str(cels))

        fahrd = self.scd.GetValue()
        celsd = round((fahrd - 32) * 5 / 9.0, 2)
        self.celsiusd.SetLabel(str(celsd))

if __name__ == '__main__':
    app = wx.App()
    window = MyWin(None, title="SpinCtrl")
    window.Show()
    app.MainLoop()

在这里插入图片描述

3. List 控件族

一个 wx.ListBox 部件呈现一个可垂直滚动的字符串列表。默认情况下,列表中的单个项目是可以选择的。ListCtrl 小组件是一个高度增强的列表显示和选择工具。超过一列的列表可以在报告视图、列表视图或图标视图中显示。

https://wintel.blog.csdn.net/article/details/130898162?spm=1001.2014.3001.5502
https://wintel.blog.csdn.net/article/details/130898214?spm=1001.2014.3001.5502

3.1. wx.ListBox(列表框)

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

  • wx.LB_SINGLE:单选列表。
  • wx.LB_MULTIPLE:多选列表。
  • wx.LB_EXTENDED:扩展选择列表,用户可以使用 SHIFT 或 CTRL 键以及光标移动键或鼠标来扩展选择。
  • wx.LB_HSCROLL:如果内容太多,创建水平滚动条(仅限Windows)。
  • wx.LB_ALWAYS_SB:始终显示垂直滚动条。
  • wx.LB_NEEDED_SB:只在需要时创建垂直滚动条。
  • wx.LB_NO_SB:不创建垂直滚动条(仅限于wxMSW和wxGTK)。
  • wx.LB_SORT:列表框内容按字母顺序排序。

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

  • EVT_LISTBOX:当列表中的项被选中或选择发生变化时,处理 wx.EVT_LISTBOX 事件。
  • EVT_LISTBOX_DCLICK:当双击列表框时,处理 wx.EVT_LISTBOX_DCLICK事件。

3.2. wx.CheckListBox(复选列表框)

3.3. wx.ListCtrl()

import wx
import wx.lib.mixins.listctrl as listmix
 
musicdata = {
   
   
1 : ("Bad English", "The Price Of Love", "Rock"),
2 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"),
3 : ("George Michael", "Praying For Time", "Rock"),
4 : ("Gloria Estefan", "Here We Are", "Rock"),
5 : ("Linda Ronstadt", "Don't Know Much", "Rock"),
6 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"),
7 : ("Paul Young", "Oh Girl", "Rock"),
8 : ("Paula Abdul", "Opposites Attract", "Rock"),
9 : ("Richard Marx", "Should've Known Better", "Rock"),
10: ("Rod Stewart", "Forever Young", "Rock"),
11: ("Roxette", "Dangerous", "Rock"),
12: ("Sheena Easton", "The Lover In Me", "Rock"),
13: ("Sinead O'Connor", "Nothing Compares 2 U", "Rock"),
14: ("Stevie B.", "Because I Love You", "Rock"),
15: ("Taylor Dayne", "Love Will Lead You Back", "Rock"),
16: ("The Bangles", "Eternal Flame", "Rock"),
17: ("Wilson Phillips", "Release Me", "Rock"),
18: ("Billy Joel", "Blonde Over Blue", "Rock"),
19: ("Billy Joel", "Famous Last Words", "Rock"),
20: ("Billy Joel", "Lullabye (Goodnight, My Angel)", "Rock"),
21: ("Billy Joel", "The River Of Dreams", "Rock"),
22: ("Billy Joel", "Two Thousand Years", "Rock")
}
 
class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
    def __init__(self, parent, ID, pos=wx.DefaultPosition,
                 size=wx.DefaultSize, style=0):
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
        listmix.ListCtrlAutoWidthMixin.__init__(self)
        
class TabPanel(wx.Panel, listmix.ColumnSorterMixin):
    """
    This will be the second notebook tab
    """
    #----------------------------------------------------------------------
    def __init__(self, parent):
        """"""
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        self.createAndLayout()
        
    def createAndLayout(self):
        # 主布局
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.list = TestListCtrl(self, wx.ID_ANY, style=wx.LC_REPORT|wx.BORDER_NONE|wx.LC_EDIT_LABELS|wx.LC_SORT_ASCENDING)
        sizer.Add(self.list, 1, wx.EXPAND)

        # 创建list
        self.populateList(musicdata.items())
        # Now that the list exists we can init the other base class,
        # see wx/lib/mixins/listctrl.py
        listmix.ColumnSorterMixin.__init__(self, 3)

        self.SetSizer(sizer)
        self.SetAutoLayout(True)
        
    def populateList(self, items):
        # list 表头
        self.list.InsertColumn(0, "Artist")
        self.list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT)
        self.list.InsertColumn(2, "Genre")

        # 插入数据        
        for key, data in items:
            index = self.list.InsertItem(0, data[0])
            self.list.SetItem(index, 1, data[1])
            self.list.SetItem(index, 2, data[2])
            self.list.SetItemData(index, key)
        
        # 控制列宽
        self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(2, 100)
 
        # show how to select an item
        self.list.SetItemState(5, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
 
        # show how to change the colour of a couple items
        # 控制颜色
        # 行1 设置为蓝色
        item = self.list.GetItem(1)
        item.SetTextColour(wx.BLUE)
        self.list.SetItem(item)

        # 行4 设置为红色
        item = self.list.GetItem(4)
        item.SetTextColour(wx.RED)
        self.list.SetItem(item)
 
        self.currentItem = 0
        
    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
    def GetListCtrl(self):
        return self.list
         
class DemoFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Panel Tutorial")
        panel = TabPanel(self)
        self.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App()
    frame = DemoFrame()
    app.MainLoop()

在这里插入图片描述

3.4. wx.ListView()

4. wx.TreeCtrl(树状控件)

https://wintel.blog.csdn.net/article/details/130917433?spm=1001.2014.3001.5502

4.1. wx.gizmos.TreeListCtrl

该控件在拉伸列的时候有条黑线,推荐用 wx.dataview.DataViewCtrl 还是视图模型模式。

import wx
import wx.gizmos as gizmos
 
class TabPanel(wx.Panel):
    """
    This will be the third notebook tab
    """
    #----------------------------------------------------------------------
    def __init__(self, parent):
        """"""
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        
        self.Bind(wx.EVT_SIZE, self.OnSize)
 
        self.tree = gizmos.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值