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
- ComboCtrl 需要用到 ComboPopup
- ComboCtrl 需要用 SetPopupControl() 指定关联的 ComboPopup
- ComboPopup 用的 GetControl() 必须实现
- ComboPopup 中文档说明的其他必须实现的方法
- 需要仔细阅读 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.

高级控件&spm=1001.2101.3001.5002&articleId=149741395&d=1&t=3&u=2bcc243abfcf4f079cc7a3ba6186aadb)

被折叠的 条评论
为什么被折叠?



