wxpython 封装listctrl 支持添加控件

掌握ListCtrl单元格颜色设计技巧 本文还有配套的精品资源,点击获取 简介:在GUI设计中,单元格颜色对于用户识别数据和状态至关重要。ListCtrl控件在wxPython、MFC或.NET框架中用于显示列表数据,并允许开发者根据条件设定单元格颜色。例如,超过阈值的数值用红色显示以警示用户,已完成的任务用绿色表示。文章介绍了如何使用wxPython的 SetItemBackgroundColour ... 阅读详情

http://blog.youkuaiyun.com/xugangjava/article/details/7951605

#now not use
class AbstractList(wx.ListCtrl,
	listmix.ListCtrlAutoWidthMixin,
	listmix.ColumnSorterMixin):
	def __init__(self, parent,columes,editlabel=False):
		"""list 控件封装 提供表头排序功能,建议使用"""
		wx.ListCtrl.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize, wx.LC_REPORT |\
		                                                                           wx.SUNKEN_BORDER)
		listmix.ListCtrlAutoWidthMixin.__init__(self)
		listmix.ColumnSorterMixin.__init__(self, len(columes))
		self.SetColumns(columes)
		self.ImageList = FileImageList()
		self.AssignImageList(self.ImageList, wx.IMAGE_LIST_SMALL)
		if editlabel:
			self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT,self.EvtBeginEditLabel)
			self.Bind(wx.EVT_LIST_END_LABEL_EDIT,self.EvtEndEditLabel)
		self.pyData = ListPyData(self)
		self.itemDataMap = {}
		self.Bind(wx.EVT_RIGHT_DOWN, self.EvtContextMenu)

	def EvtContextMenu(self,evt):
		pMenu=self.InitPopuMenu()
		assert pMenu
		self.PopupMenu(pMenu)
		pMenu.Destroy()

	def InitPopuMenu(self):
		"""init poup menu"""

	def EvtEndEditLabel(self,evt):
		"""end edit label"""

	def EvtBeginEditLabel(self,evt):
		"""begein edit label"""
		evt.Allow()

	def SetColumns(self, columes):
		"""添加表头信息"""
		i = 0
		for name, width in columes:
			self.InsertColumn(i, name)
			if width: self.SetColumnWidth(i, width)
			else: self.setResizeColumn(i)
			i += 1

	def GetListCtrl(self):
		"""这个方法只是为了表头排序"""
		return self

	def GetPyData(self,idx):
		return self.pyData.get(idx)

	def RemovePyData(self,idx):
		del self.pyData[idx]

	def RawIconAndRow(self, item):
		"""格式化对象,添加到每一列中去"""
		NotImplemented('RawIconAndRow')

	def AddRow(self, item, idx=sys.maxint):
		icon, row = self.RawIconAndRow(item)
		idx = self.InsertImageStringItem(idx, row[0], icon)
		cols_num=len(row)
		for i in xrange(cols_num):
			self.SetStringItem(idx, i, row[i])
		self.pyData[idx] = item
		self.itemDataMap[idx] = row
		return idx

########################################################################



class AbstractControlList(AbstractList):
	def __init__(self, parent,columes,editlabel=False):
		AbstractList.__init__(self, parent,columes,editlabel)
		self.Bind(wx.EVT_PAINT,self.PaintControl)
		self.Bind(wx.EVT_LIST_COL_DRAGGING, self.PaintControl)
		self.Bind(wx.EVT_LIST_COL_END_DRAG, self.PaintControl)
		self.Bind(wx.EVT_SCROLL, self.PaintControl)

	def GetControlColNum(self):
		NotImplemented('GetControlColNum')

	def GetControlItem(self,item,col):
		NotImplemented('GetCellControl')

	def RefreshColumText(self,rowidx):
		"""refreshText of the list"""


	def PaintControl(self,evt):
		count=self.GetItemCount()
		control_cols=self.GetControlColNum()
		for rowidx in xrange(count):
			for col in control_cols:
				item=self.pyData[rowidx]
				control=self.GetControlItem(item,col)
				rect=self.GetCellRect(rowidx,col)
				control.SetDimensions(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2)
				control.Update()
			self.RefreshColumText(rowidx)

	def DeleteItem(self, idx):
		control_cols=self.GetControlColNum()
		pyData=self.GetPyData(idx)
		assert pyData
		for col in control_cols:
			control=self.GetControlItem(pyData,col)
			control.Hide()
			control=None
		self.RemovePyData(idx)
		AbstractList.DeleteItem(self,idx)


	def DeleteAllItems(self):
		control_cols=self.GetControlColNum()
		for pyData in self.pyData.values():
			for col in control_cols:
				control=self.GetControlItem(pyData,col)
				control.Destory()
		self.pyData.clear()
		AbstractList.DeleteAllItems(self)


	def RawIconAndRow(self, item):
		"""格式化对象,添加到每一列中去"""
		NotImplemented('RawIconAndRow')

	def AddRow(self, item, idx=sys.maxint):
		icon, row = self.RawIconAndRow(item)
		idx = self.InsertImageStringItem(idx, row[0], icon)
		row_cout=len(row)
		control_cols=self.GetControlColNum()
		for i in xrange(row_cout):
			if i in control_cols:
				row[i]=''
			else:
				self.SetStringItem(idx, i, row[i])
		self.pyData[idx] = item
		self.itemDataMap[idx] = row
		return idx

	def _GetColumnWidthExtent(self, col):
		col_locs,loc = [0],0
		num_cols = min(col+1, self.GetColumnCount())
		for n in xrange(num_cols):
			loc += self.GetColumnWidth(n)
			col_locs.append(loc)
		x0 = col_locs[col]
		x1 = col_locs[col+1] - 1
		return x0, x1

	def GetColumnRect(self, col):
		x0, x1 = self._GetColumnWidthExtent(col)
		r = self.GetItemRect(0)
		y0 = r.y
		y1 = self.GetClientSize()[1]
		x_scroll = self.GetScrollPos(wx.HORIZONTAL)
		return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))


	def GetCellRect(self, row, col):
		x0, x1 = self._GetColumnWidthExtent(col)
		r = self.GetItemRect(row)
		y0 = r.y
		y1 = r.GetBottom()
		x_scroll = self.GetScrollPos(wx.HORIZONTAL)
		return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))

运行效果


2012 12 9

发现原先实现的比较难用,更新简化代码,,使用issubleclass判断 row是否为控件,如果为控件则保存到一个拉链链表中

ZiperMap(代码在http://blog.youkuaiyun.com/xugangjava/article/details/7532382)

class AbstractControlList(AbstractList):
	def __init__(self, parent,columes,editlabel=False,style=wx.LC_REPORT):
		AbstractList.__init__(self, parent,columes,editlabel,False,style)

		self.Bind(wx.EVT_PAINT,self.PaintControl)
		self.Bind(wx.EVT_LIST_COL_DRAGGING, self.PaintControl)
		self.Bind(wx.EVT_LIST_COL_END_DRAG, self.PaintControl)
		self.Bind(wx.EVT_SCROLL, self.PaintControl)
		self.pyContol=ZipperMap()

	def RefreshColumText(self,rowidx):
		"""refreshText of the list"""


	def PaintControl(self,evt):
		count=self.GetItemCount()
		for rowidx in xrange(count):
			pyData=self.GetPyData(rowidx)
			index_control=self.pyContol.get(id(pyData))
			if not index_control:continue
			for col,control in index_control:
				rect=self.GetCellRect(rowidx,col)
				control.SetDimensions(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2)
			self.RefreshColumText(rowidx)
		evt.Skip()

	def DeleteItem(self, idx):
		pyData=self.GetPyData(idx)
		assert pyData
		index_control=self.pyContol.get(id(pyData))
		if index_control:
			for col,control in index_control:
				self.__DropControl(control)
		AbstractList.DeleteItem(self,idx)

	def __DropControl(self,control):
		control.Hide()
		control.Destroy()
		del control

	def DeleteAllItems(self):
		for pyData in self.pyData.values():
			index_control=self.pyContol.get(id(pyData))
			if not index_control:continue
			for col,control in index_control:
				self.__DropControl(control)
			del self.pyContol[id(pyData)]
		AbstractList.DeleteAllItems(self)

	def RawIconAndRow(self, item):
		"""格式化对象,添加到每一列中去"""
		NotImplemented('RawIconAndRow')

	def AddRow(self, item, idx=sys.maxint):
		icon, row = self.RawIconAndRow(item)
		idx = self.InsertImageStringItem(idx, row[0], icon)
		row_cout=len(row)
		for i in xrange(row_cout):
			if issubclass(type(row[i]),wx.Control):
				self.pyContol[id(item)]=i,row[i]
				row[i]=''
			else:
				self.SetStringItem(idx, i, row[i])
		self.pyData[idx] = item
		self.itemDataMap[idx] = row
		return idx

	def _GetColumnWidthExtent(self, col):
		col_locs,loc = [0],0
		num_cols = min(col+1, self.GetColumnCount())
		for n in xrange(num_cols):
			loc += self.GetColumnWidth(n)
			col_locs.append(loc)
		x0 = col_locs[col]
		x1 = col_locs[col+1] - 1
		return x0, x1

	def GetColumnRect(self, col):
		x0, x1 = self._GetColumnWidthExtent(col)
		r = self.GetItemRect(0)
		y0 = r.y
		y1 = self.GetClientSize()[1]
		x_scroll = self.GetScrollPos(wx.HORIZONTAL)
		return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))


	def GetCellRect(self, row, col):
		x0, x1 = self._GetColumnWidthExtent(col)
		r = self.GetItemRect(row)
		y0 = r.y
		y1 = r.GetBottom()
		x_scroll = self.GetScrollPos(wx.HORIZONTAL)
		return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))


直接使用RawIconAndRow 传入控件既可



wxpython控件之Listctrl 详细总结了wxpython中Listctrl方法使用。 立即下载

相关推荐

自绘CMFCListCtrl,改变行高,行的背景颜色

可根据自己需要改变行高和背景颜色,开发工具为VS2013

wxpython wx listctrl_wxpython 封装listctrl 支持添加控件 | 学步园

http://blog.youkuaiyun.com/xugangjava/article/details/7951605#now not useclass AbstractList(wx.ListCtrl,listmix.ListCtrlAutoWidthMixin,listmix.ColumnSorterMixin):def __init__(self, parent,columes,editlabel=...

weixin_39701735的博客 468

CMFCListCtrl的改造版,可以自行设定每行宽度,改变行的背景颜色

继承自CMFCListCtrl(CListCtrl的新版本),可用VS2013、2015及2017编译。

实战wxPython: 040 - 高级控件之列表控件ListCtrl

wx.ListCtrl是项列表的图形表示。一个wx.ListBox只能有一列。 wx.ListCtrl可以有多个列。wx.ListCtrl是一个非常常见和有用的控件。例如,文件管理器使用wxListCtrl来显示文件系统上的目录和文件。 wx.ListCtrl可以以三种不同的格式使用。列表视图、报表视图、图标视图和小图标视图。

seniorwizard的专栏 3423

实现CTreeCtrl 多行选择,单行高亮显示

MFC 中 CListCtrl 已经有 集成类 CMFCListCtrl,实现 单行高亮,多行选择。但是 CTreeCtrl 却没有,纵观网络 也没有完整的实现,今天 贡献给大家

CListCtrl控件中的第一列添加图片

在CListCtrl控件中的第一列添加图片

wxpython wx listctrl_wxPython - ListCtrl列表排序

13.4.2如何对列表排序?在wxPython中有三个有用的方法可以对列表进行排序,在这一节,我们将按照从易到难的顺序来讨论。在创建的时候告诉列表去排序对一个列表控件排序的最容易的方法,是在构造函数中告诉该列表控件对项目进行排序。你可以通过使用样式标记wx.LC_SORT_ASCENDING或wx.LC_SORT_DESCENDING来实现。这两个标记导致了列表在初始显示的时候被排序,并且在Wi...

weixin_39899021的博客 723

LDPC码译码原理——概率公式推导

怎么说呢,一直以来都想写一下博客。近半年多来我一直在学习LDPC码译码上的东西,主要是在FPGA实现上的,所以这次想写一些关于这方面的内容,包括译码的原理、仿真以及实现。(当然是基于准循环LDPC码上实现的)不过呢,我写这个的初衷是为了让初学者理解入门用的,而不是在大牛面前班门弄斧,有错误之处欢迎大家批评指正。不知道会不会有人一开始像我一样,为了学好LDPC码,先去好好了解其它的诸如RS码或者是卷...

stand_by_me123的博客 2万+

CMFCListCtrl控件使用

CMFCListCtrl是MS从CListCtrl派生出来的新类,灵活性上有所进步,特别是改变行列颜色、改变字体,不用像CListCtrl很多步骤,要处理很复杂的数据结构。现在记录下,先看效果图 用类向导从CMFCListCtrl派生出CMyListCtrl类;声明虚函数virtual COLORREF OnGetCellTextColor(int nRow, int nColum);

小猿一枚的专栏 6694

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

ESD笔记(三)_常用ESD保护电路优缺点

根据ESD防护器件的TLP I-V特性我们可将ESD器件分为回滞类和非回滞类两种; 回滞类的ESD器件包括NPN三极管、栅极接地 NMOS ( GGNMOS, Gate-grounded NMOS )、可控桂(SCR, siliconcontrolled rectifier)等。 非回滞类的ESD器件包括二极管、二极管串、沟道工作的MOS管、PNP三极管、栅极接电源的PMOS(GDPMOS)等,与回滞类ESD器件相比,其TLP曲线没有负阻区的存在。 常用于ESD防护的器件包括PN结二极管、GGN

weixin_47139649的博客 1万+

VS2010中新控件的编程------CMFCListCtrl列表控件的应用

CMFCListCtrl列表控件的应用    首先建立以CMFCListCtrl为基类的CMyListCtrl,并重载OnGetCellTextColor以便设置文本颜色,重载OnGetCellBkColor以便设置背景颜色,重载OnGetCellFont以便设置字体,重载OnCompareItems以便按照一定规则排序。重载的关键函数如下: COLORREF CMyListCtrl::OnG

mr_liyonghong的专栏 8298

深度学习注意力机制新突破:YOLOv8结合SimAM无参数注意力模块,让目标检测更精准!

在计算机视觉领域,注意力机制已成为提升模型性能的关键技术。然而,传统的注意力模块如SENet、CBAM等往往引入大量额外参数,增加了模型的复杂度和计算负担。本文介绍一种创新的无参数注意力机制——SimAM(Simple Parameter-Free Attention Module),并将其成功应用于YOLOv8目标检测框架。SimAM基于神经科学理论,通过定义能量函数为特征图计算3D注意力权重,无需任何额外参数即可显著提升模型性能。本文详细阐述了SimAM的理论基础、实现原理,并提供了完整的YOLOv8集

YOLO 97

36 张图梳理 Intellij IDEA 常用设置

点击上方“阿拉奇学Java”,选择“置顶或者星标”每天早晨00点00分,与你相约!往日回顾:公司接口裸奔10年了,有必要用API接口签名验证吗? 显示工具条(1)效果图(2)设置方法标注...

qq_36189144的博客 378

视觉Transformer实战 | Data-efficient image Transformer(DeiT)详解与实现

在计算机视觉领域,Vision Transformer (ViT) 已经证明了纯 Transformer 架构在图像分类任务上的强大能力。然而,ViT 通常需要在大规模数据集上预训练才能达到最佳性能,DeiT (Data-efficient image Transformer) 通过引入一系列训练策略和优化,使得 Transformer 模型能够在相对较小的数据集上取得优异表现。本节将详细介绍 DeiT 的技术原理,并使用 PyTorch 从零开始实现 DeiT 模型。

盼小辉丶的博客 1340

【异常】OpenAI提示内容有误 Invalid prompt: your prompt was flagged as potentially violating our usage policy.

用户需优先调整提示内容,确保符合OpenAI的使用政策。若问题持续,建议结合请求ID和具体代码示例联系官方支持。同时,可参考腾讯云、Microsoft Q&A等平台提供的错误处理实践(如重试机制、日志记录)优化代码健壮性。

奶爸的编程之路,也就一周冷个三天 2057

IntelliJ IDEA 超全优化设置,效率杠杠的!

作者 |请叫我小思来源 | 优快云显示工具条(1)效果图(2)设置方法标注1:View–>Toolbar标注2:View–>Tool Buttons设置鼠标悬浮提示(1)...

JAVA葵花宝典 270

【WRF-Urban】WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WW、forever的博客 495

MFCListCtrl支持排序

原始的CMFCListCtrl本身支持排序,重载OnCompareItems,在设置数据时需要SetItemData

holiday21的博客 401

构建自己的 Qt 插件系统

Qt 本身提供了插件相关的技术,但并没有提供一个通用的插件框架!倘若要开发一个较大的 GUI 应用程序,并希望使其可扩展,那么拥有这样一个插件框架无疑会带来很大的好处。

青春不老,奋斗不止! 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

cmfclistctrl设置单行文字颜色_IntelliJ IDEA 非常有必要的设置

下面是 idea 使用过程中非常有必要的一些设置,让神器用起来更加顺手。编码集打开 File >Settings >Editor >File encodings,将如下位置设置为 UTF-8另外将 Transparent native-to-ascii conversion 勾选,即自动转换 ASCII 编码。其工作原理是:在文件中输入文字时他会自动的转换为 Unicode 编码...

weixin_39588104的博客 150

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CMFCListCtrl自动排序的实现

   由于工作中要用到CMFCListCtrl控件中的排序功能,但是MFC下的类CMFCListCtrl中只提供了虚函数CompareItems,因此这个函数在我们自己的代码中是要自己实现的。我想从CMFCListCtrl继承下来实现自己的CXSLMFCListCtrl。她的功能就有自动排序的,根据其ListCtrl控件上的内容来判断数据类型,然后再作排序的实现。优先排序顺序为整形、时间、IP、字

xiaolin317的专栏 2990

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC2008 NewControl 示例

3、VC2008 NewControl 示例(源码:http://download.youkuaiyun.com/source/2819075vc2008目录下面好像也是有的) CMFCButton例:变量类型:CMFCButton m_mfcBtn;普通按钮:1)在App::InitInstance()中添加:CMFCVisualManager::SetDefaultMa

Alsmile的专栏 3964

cmfclistctrl设置单行文字颜色_CAD文字样式原来还这么深奥!

文尾左下角阅读原文看视频教程好课推荐:零基础CAD:点我CAD室内:点我周站长CAD:点我CAD机械:点我Bim教程:点我CAD建筑:点我CAD三维:点我全屋定制:点我ps教程:点我苹果版CAD:点我3dmax教程:点我UG教程:点我SU教程:点我solidworks教程:点我rhino教程:点我CAD动态块:点我CAD电气:点我室内手绘:点我更多视频教程:点...

weixin_39636253的博客 513

idea设置中文界面_IntelliJ IDEA这样设置,用起来不仅顺手而且特爽

前言程序员对待IDE都是虔诚的,经常因为谁是最好的IDE而在江湖上掀起波澜,曾经我也是。后来我遇到了IDEA,从此是它,余生都是它。IDEA 毫无疑问是目前最强大的Java开发工具了,但是大部分的人并没有将它用到极致,很多实用的配置,插件,小技巧被忽视。就像JDK8的新特性一样,你知道它在且坚持不用,但是只要用过一次就知道什么是真滴香。IDEA 软件设置Settings页面Settings是对软件...

weixin_39723102的博客 4301

实战PyQt5: 007-单行编辑控件QLineEdit

QLineEdit 简介 QLineEdit是一个单行文本输入控件,可输入单行的文本字符串,这里输入常见的情况有 普通文本,比如用户登录名,文件保存路径等; 数字,整数或者浮点数; 密码输入; 日期输入; EMail地址; IP地址; MAC地址; 许可证号; 其他单行输入。 QLineEdit中常用方法: setAlignment():按规定的方式对齐文本; clear(): 清除文本框内容; setEchoMode():设置文本框的显示格式; setPlaceholderte

seniorwizard的专栏 1812
上一篇: wxpython skin bug(staticbox背景绘制)
下一篇: Pyhton Singleton模式
xugangjava
博客等级 码龄16年 83粉丝 72原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值