wxPython自定义控件
实战wxPython系列051
前面系列文章中,我们介绍了wxPython提供各种的各种控件,在一般情况下可以满足我们开发应用的各种需求。但是在一些情况下,比如对按钮的美化,一个可以显示CPU占用率的控件等等。这首就需要自定义的控件,才能满足要求。
自定义控件可以通过两种方式创建:一种是通过修改或增强现有控件,另一种是我们使用GDI直接创建。下面我们将分别演示采用这两种方式如何在wxPython中实现一个自定义控件。
一、简单的超链接控件
创建一个超链接控件,我们基于wx。lib。stattext。GenStaticText控件来构建它,控件的字体用蓝色显示。点击该控件时将调用默认浏览器打开指定的网址。importwxfromwx。lib。stattextimportGenStaticTextimportwebbrowserclassMyLink(GenStaticText):definit(self,args,kw):super(MyLink,self)。init(args,kw)self。font1wx。Font(11,wx。SWISS,wx。NORMAL,wx。BOLD,True,Verdana)self。font2wx。Font(11,wx。SWISS,wx。NORMAL,wx。BOLD,False,Verdana)self。SetFont(self。font2)self。SetForegroundColour(0000ff)self。Bind(wx。EVTMOUSEEVENTS,self。OnMouseEvent)self。Bind(wx。EVTMOTION,self。OnMouseEvent)defSetUrl(self,url):self。urlurldefOnMouseEvent(self,e):ife。Moving():self。SetCursor(wx。Cursor(wx。CURSORHAND))self。SetFont(self。font1)elife。LeftUp():webbrowser。opennew(self。url)else:self。SetCursor(wx。NullCursor)self。SetFont(self。font2)e。Skip()classSampleHyperlink(wx。Frame):definit(self,args,kw):super(SampleHyperlink,self)。init(args,kw)self。InitUi()defInitUi(self):self。SetTitle(实战wxPython:自定义控件演示)self。SetSize(400,240)panelwx。Panel(self)vboxwx。BoxSizer(wx。VERTICAL)hboxwx。BoxSizer(wx。HORIZONTAL)stGenStaticText(panel,label连接到Web站点:)st。SetFont(wx。Font(11,wx。FONTFAMILYSWISS,wx。FONTSTYLENORMAL,wx。FONTWEIGHTBOLD,False,Verdana))hbox。Add(st,flagwx。LEFT,border20)linkwidMyLink(panel,labelbing)linkwid。SetUrl(https:cn。bing。com)hbox。Add(linkwid,flagwx。LEFT,border20)vbox。Add(hbox,flagwx。TOP,border30)panel。SetSizer(vbox)self。Centre()defmain():appwx。App()sampleSampleHyperlink(None)sample。Show()app。MainLoop()ifnamemain:main()
上面的例子中我们使用已有控件,没有绘制任何新的东西,做了一点修改,构建了一个超链接控件。fromwx。lib。stattextimportGenStaticTextimportwebbrowser
导入我们需要的模块,webbrowser是python的标准模块,使用它在默认浏览器中打开超链接。self。SetFont(self。font2)self。SetForegroundColour(0000ff)
修改控件中字体和字体的颜色ife。Moving():self。SetCursor(wx。Cursor(wx。CURSORHAND))self。SetFont(self。font1)
如果鼠标移到链接上方时,我们显示文本下划线,并将鼠标设置为手型。elife。LeftUp():webbrowser。opennew(self。url)
如果点击链接,将在默认浏览器打开超链接控件所关联的网址。
图1:自定义超链接演示
二、一个显示资源使用率的控件
在一些应用中,会需要监测系统资源,温度,内存消耗,CPU使用率等等。如果仅单纯地使用文字(比如CPU60),则显得不那么直观,如果使用一定定制化的控件,以直观的图形方式来显示,则会更加一目了然。importwxclassMyCPU(wx。Panel):definit(self,parent):wx。Panel。init(self,parent,size(80,110))self。parentparentself。SetBackgroundColour(black)self。Bind(wx。EVTPAINT,self。OnPaint)defOnPaint(self,e):dcwx。PaintDC(self)dc。SetDeviceOrigin(0,100)dc。SetAxisOrientation(True,True)posself。parent。GetParent()。GetParent()。selrectpos5foriinrange(1,21):ifirect:dc。SetBrush(wx。Brush(075100))dc。DrawRectangle(10,i4,30,5)dc。DrawRectangle(41,i4,30,5)else:dc。SetBrush(wx。Brush(36ff27))dc。DrawRectangle(10,i4,30,5)dc。DrawRectangle(41,i4,30,5)classSampleMyCPU(wx。Frame):definit(self,args,kw):super(SampleMyCPU,self)。init(args,kw)self。InitUi()defInitUi(self):self。SetTitle(实战wxPython:自定义控件演示)self。SetSize(400,240)self。sel0panelwx。Panel(self)centerPanelwx。Panel(panel)self。cpuMyCPU(centerPanel)hboxwx。BoxSizer(wx。HORIZONTAL)self。sliderwx。Slider(panel,valueself。sel,maxValue100,size(1,100),stylewx。VERTICALwx。SLINVERSE)self。slider。SetFocus()hbox。Add(centerPanel,0,wx。LEFTwx。TOP,20)hbox。Add(self。slider,0,wx。LEFTwx。TOP,30)self。Bind(wx。EVTSCROLL,self。OnScroll)panel。SetSizer(hbox)self。Centre()defOnScroll(self,e):self。sele。GetInt()self。cpu。Refresh()defmain():appwx。App()sampleSampleMyCPU(None)sample。Show()app。MainLoop()ifnamemain:main()
上面的例子里,我们创建一个控件,它继承自wx。Panel。在其上绘制了一些矩形,矩形的颜色取决于滑块控件的值,可以为深绿或者亮绿。dc。SetDeviceOrigin(0,100)dc。SetAxisOrientation(True,True)
上面的例子里,我们创建一个控件,它继承自wx。Panel。在其上绘制了一些矩形,矩形的颜色取决于滑块控件的值,可以为深绿或者亮绿。dc。SetDeviceOrigin(0,100)dc。SetAxisOrientation(True,True)
将坐标系设置为笛卡尔坐标系,让绘制更加直观。posself。parent。GetParent()。GetParent()。selrectpos5
获取sizer的值。一列有20个小矩形,滑块的变化范围为0到100。rect参数保存将滑块值转变成需要用亮绿色绘制的矩形数目。foriinrange(1,21):ifirect:dc。SetBrush(wx。Brush(075100))dc。DrawRectangle(10,i4,30,5)dc。DrawRectangle(41,i4,30,5)else:dc。SetBrush(wx。Brush(36ff27))dc。DrawRectangle(10,i4,30,5)dc。DrawRectangle(41,i4,30,5)
这里我们绘制了40个矩形,每列20个。如果矩形数目大于rect的值,用暗绿色绘制,否则用亮绿色绘制。
图2:自定义控件之CPU占用率演示
三、本文知识点什么时候需要自定义控件。创建自定义控件的两种方式。使用EVTPAINT事件。
前一篇:wxPython动态添加和删除控件
欢迎关注,评论,收藏,点赞,和转发。