范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

wxPython自定义控件

  实战wxPython系列-051
  前面系列文章中,我们介绍了wxPython提供各种的各种控件,在一般情况下可以满足我们开发应用的各种需求。但是在一些情况下,比如对按钮的美化,一个可以显示CPU占用率的控件等等。这首就需要自定义的控件,才能满足要求。
  自定义控件可以通过两种方式创建:一种是通过修改或增强现有控件,另一种是我们使用GDI直接创建。下面我们将分别演示采用这两种方式如何在wxPython中实现一个自定义控件。
  一、简单的超链接控件
  创建一个超链接控件,我们基于 wx.lib.stattext.GenStaticText 控件来构建它,控件的字体用蓝色显示。点击该控件时将调用默认浏览器打开指定的网址。import wx from wx.lib.stattext import GenStaticText import webbrowser  class MyLink(GenStaticText):          def __init__(self, *args, **kw):         super(MyLink, self).__init__(*args, **kw)          self.font1 = wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD, True, "Verdana")         self.font2 = wx.Font(11, wx.SWISS, wx.NORMAL, wx.BOLD, False, "Verdana")          self.SetFont(self.font2)         self.SetForegroundColour("#0000ff")          self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouseEvent)         self.Bind(wx.EVT_MOTION, self.OnMouseEvent)      def SetUrl(self, url):         self.url = url      def OnMouseEvent(self, e):         if e.Moving():             self.SetCursor(wx.Cursor(wx.CURSOR_HAND))             self.SetFont(self.font1)         elif e.LeftUp():             webbrowser.open_new(self.url)         else:             self.SetCursor(wx.NullCursor)             self.SetFont(self.font2)          e.Skip()  class SampleHyperlink(wx.Frame):      def __init__(self, *args, **kw):         super(SampleHyperlink, self).__init__(*args, **kw)          self.InitUi()      def InitUi(self):         self.SetTitle("实战wxPython: 自定义控件演示")         self.SetSize(400, 240)          panel = wx.Panel(self)          vbox = wx.BoxSizer(wx.VERTICAL)         hbox = wx.BoxSizer(wx.HORIZONTAL)          st = GenStaticText(panel, label="连接到Web站点:")         st.SetFont(wx.Font(11, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, "Verdana"))         hbox.Add(st, flag=wx.LEFT, border=20)          link_wid = MyLink(panel, label="bing")         link_wid.SetUrl("https://cn.bing.com")         hbox.Add(link_wid, flag=wx.LEFT, border=20)          vbox.Add(hbox, flag=wx.TOP, border=30)         panel.SetSizer(vbox)          self.Centre()  def main():     app = wx.App()     sample = SampleHyperlink(None)     sample.Show()     app.MainLoop()  if __name__ == "__main__":     main()
  上面的例子中我们使用已有控件,没有绘制任何新的东西,做了一点修改,构建了一个超链接控件。from wx.lib.stattext import GenStaticText import webbrowser
  导入我们需要的模块,webbrowser 是 python 的标准模块,使用它在默认浏览器中打开超链接。self.SetFont(self.font2) self.SetForegroundColour("#0000ff")
  修改控件中字体和字体的颜色if e.Moving():      self.SetCursor(wx.Cursor(wx.CURSOR_HAND))      self.SetFont(self.font1)
  如果鼠标移到链接上方时,我们显示文本下划线,并将鼠标设置为手型。elif e.LeftUp():      webbrowser.open_new(self.url)
  如果点击链接,将在默认浏览器打开超链接控件所关联的网址。
  图1:自定义超链接演示
  二、一个显示资源使用率的控件
  在一些应用中,会需要监测系统资源,温度,内存消耗,CPU使用率等等。如果仅单纯地使用文字(比如CPU 60%),则显得不那么直观,如果使用一定定制化的控件,以直观的图形方式来显示,则会更加一目了然。import wx  class MyCPU(wx.Panel):          def __init__(self, parent):         wx.Panel.__init__(self, parent, size=(80, 110))         self.parent = parent         self.SetBackgroundColour("black")         self.Bind(wx.EVT_PAINT, self.OnPaint)      def OnPaint(self, e):                  dc = wx.PaintDC(self)         dc.SetDeviceOrigin(0, 100)         dc.SetAxisOrientation(True, True)          pos = self.parent.GetParent().GetParent().sel         rect = pos / 5          for i in range(1,21):             if i>rect:                 dc.SetBrush(wx.Brush("#075100"))                 dc.DrawRectangle(10, i * 4, 30, 5)                 dc.DrawRectangle(41, i * 4, 30, 5)             else:                 dc.SetBrush(wx.Brush("#36ff27"))                 dc.DrawRectangle(10, i * 4, 30, 5)                 dc.DrawRectangle(41, i * 4, 30, 5)  class SampleMyCPU(wx.Frame):      def __init__(self, *args, **kw):         super(SampleMyCPU, self).__init__(*args, **kw)          self.InitUi()      def InitUi(self):         self.SetTitle("实战wxPython: 自定义控件演示")         self.SetSize(400, 240)          self.sel = 0          panel = wx.Panel(self)         centerPanel = wx.Panel(panel)          self.cpu = MyCPU(centerPanel)          hbox = wx.BoxSizer(wx.HORIZONTAL)          self.slider = wx.Slider(panel, value=self.sel, maxValue=100, size=(-1,100), style=wx.VERTICAL|wx.SL_INVERSE)         self.slider.SetFocus()          hbox.Add(centerPanel, 0, wx.LEFT|wx.TOP, 20)         hbox.Add(self.slider, 0, wx.LEFT|wx.TOP, 30)          self.Bind(wx.EVT_SCROLL, self.OnScroll)          panel.SetSizer(hbox)          self.Centre()      def OnScroll(self, e):         self.sel = e.GetInt()         self.cpu.Refresh()  def main():     app = wx.App()     sample = SampleMyCPU(None)     sample.Show()     app.MainLoop()  if __name__ == "__main__":     main()
  上面的例子里,我们创建一个控件,它继承自wx.Panel。在其上绘制了一些矩形,矩形的颜色取决于滑块控件的值,可以为深绿或者亮绿。dc.SetDeviceOrigin(0, 100)  dc.SetAxisOrientation(True, True)
  上面的例子里,我们创建一个控件,它继承自wx.Panel。在其上绘制了一些矩形,矩形的颜色取决于滑块控件的值,可以为深绿或者亮绿。dc.SetDeviceOrigin(0, 100)  dc.SetAxisOrientation(True, True)
  将坐标系设置为笛卡尔坐标系,让绘制更加直观。pos = self.parent.GetParent().GetParent().sel rect = pos / 5
  获取sizer的值。一列有20个小矩形,滑块的变化范围为0到100 。rect参数保存将滑块值转变成需要用亮绿色绘制的矩形数目。 for i in range(1,21):      if i>rect:          dc.SetBrush(wx.Brush("#075100"))          dc.DrawRectangle(10, i * 4, 30, 5)          dc.DrawRectangle(41, i * 4, 30, 5)      else:          dc.SetBrush(wx.Brush("#36ff27"))          dc.DrawRectangle(10, i * 4, 30, 5)          dc.DrawRectangle(41, i * 4, 30, 5)
  这里我们绘制了40个矩形,每列20个。如果矩形数目大于rect的值,用暗绿色绘制,否则用亮绿色绘制。
  图2:自定义控件之CPU占用率演示
  三、本文知识点 什么时候需要自定义控件。创建自定义控件的两种方式。使用EVT_PAINT事件。
  前一篇:wxPython - 动态添加和删除控件
  欢迎关注,评论,收藏,点赞,和转发。

莫斯科国立语言大学表彰孔院教师(神州学人网讯)在2023年春季学期开学前会议上,莫斯科国立语言大学(以下简称莫语大)校长伊琳娜克拉耶娃肯定了莫语大孔子学院过去一年所做的工作,表彰了马博香牟璇黎莉程园园4位孔院教美近期密集对华发起舆论猛攻,或因西方要收坏消息近日,G20外长会召开,但在这场吸引了全球目光的会议刚开始时,印度总理的一番话,让这次大会蒙上了一层阴影。据俄罗斯卫星通讯社消息,3月2日在新德里举行的二十国集团(G20)外长会议热线实录丨职工拒绝降薪续签有补偿金吗?小休问我是一家外贸公司的装卸工,在这家公司工作了3年。日前,我的劳动合同到期,单位说续签,但提出,由于近年来企业经济效益下滑,续签的劳动合同约定的薪水要适当下调。我不同意,单位就准蔡天凤事件出现重大反转证据链不完善,警方再去大埔村寻找线索一定不要在金钱上经常扶持一个人,因为等你哪天不扶持他了,必是他恨你入骨的时候。香港名媛蔡天凤遇害案一事,经过多日的调查之后,本来大家都以为应该要尘埃落定了,毕竟事实清楚,女方的头颅ChatGPT与保险四个ChatGPT回答不出来的本质问题为了较系统地分析ChatGPT对保险的影响,本文首先从ChatGPT的能力出发明确其能力上限和优势,然后介绍ChatGPT能力在保险公司应用的价值层次明确其应用产生价值的路径,接着从童星到退网网红,25岁的尤浩然玩儿废了前程,谁都救不了他2005年一部情景喜剧家有儿女横空出世。你的童年,我的童年,好像都一样我叫夏雨,我叫夏雪,我叫夏冰雹。熟悉的BGM和台词一响起,准是夏雨夏雪刘星这三个孩子要作妖。那些年来,就是他们看美国对乌克兰的单边援助,对比二战前的国际局势不寒而栗第二次世界大战开始前,公认的世界霸主是英格兰,何况其身边还有另一军事强国法兰西与之同进退。所以,美国要想成为风光无限的霸主,必然困难重重。不过,看看冷战四十年,美国更换了多少届政府劳荣枝死刑复核结果三选一,核准难如愿,真相或难以接受备受关注的劳荣枝案如今已进入到最高院死刑复核阶段,如今距离二审宣判已经过去了3个多月,结局究竟会怎样?根据现有信息,可以得出5点信息对于重大刑事案件及社会关注度较高的案件,最高院死如果美国某个州宣布独立能得到美国政府和国会的同意吗众所周知美国老喜欢煽动别国的分裂主义势力通过和平演变肢解苏联,煽动科索沃闹独立,把别国暴徒的行为称为美丽的风景线可如果反过来美国的某个州要是宣布独立又会如何呢?有这样一种说法认为美180万经营贷变房贷,银行告了!法院赶紧还钱,否则拍卖房子房贷置换经营贷的风险出现暴露。近日已有银行以借款人违反合同约定擅自改变贷款用途为由起诉借款人并获得法院判决支持。3月1日,广州市中级人民法院(以下简称广州中院)发布消息称,有借款人法国家庭消费受通胀抑制经济增长乏力来源海外网根据法国国家统计与经济研究所(Insee)2月28日公布的数据,2023年1月,作为法国经济传统引擎的家庭消费略有反弹,但仍受到通货膨胀的抑制。据费加罗报2月28日报道,
主业持续收缩流动性压力不减,汉邦高科2022年预亏1。29亿近日A股上市公司开始陆续披露2022年度业绩预告。据证券时报数据宝统计,截至1月11日,已披露业绩预告的公司共计164家,其中业绩预增预盈的有116家业绩预降预亏的公司共有35家,威迈斯递交IPO上会稿半年营收15亿万仁春控制43股权雷递网雷建平1月12日深圳威迈斯新能源股份有限公司(简称威迈斯新能源)日前递交上会稿,准备在科创板上市。威迈斯新能源计划募资13。32亿元。其中,6。2亿元用于新能源汽车电源产品生为什么Unionfab可以帮助3D打印工厂实现智能化全流程管理?动荡时代最大的危险不是动荡本身,而是仍然用过去的逻辑做事。现代管理学之父德鲁克AIoT时代下云端的挑战与机遇我们站在一个滚滚向前的时代大浪潮之下,过去的这几年,我们看到的是人工智能蔚来确认ES8开4年赔34万!原价54。8万,二手车回购21万ES8创始版是蔚来推出的首款量产车型,官方指导价高达54。8万元。经过蔚来汽车官方评估,一台2018年7月23日开票,行驶里程3万公里的ES8创始版,目前官方回购价只有21万左右,何谓无线?何谓无线?无线无线是指不用导线而用电波或光等进行的通信。电波具有向广阔空间扩散的性质,因此被用于广播及电视广播等公共事业上面。近年,随着加密技术的发展,电波不仅在公共事业上面,在以科技初创公司IGDrones开发出印度首款5G无人机据ANI1月11日报道,科技初创公司IGDrones诞生于奥里萨邦桑巴尔普尔的VeerSurendraSai理工大学(VSSUT)校园,开发了一种能够垂直起降的5G无人机。图片来自广州三年新增64家上市公司,将实施新一轮推动企业上市计划南都讯记者王诗琪1月11日,广州市举办加快推进企业上市高质量发展领头羊行动计划(20202022)总结大会。记者从大会上了解到,自2020年领头羊行动计划实施以来,三年间,广州新增李蓓接近满仓股票!去年末大幅加仓,再提牛市起点,预期温和复苏将至有私募魔女之称的李蓓,在去年末再次做出重要的投资动作。作为近年收益最突出的宏观策略私募机构之一,李蓓执掌的半夏投资规模在2022年逆势突破百亿元。给人印象同样深刻的是,在去年上半年周黑鸭股价2天暴跌27,被传利润预测低于2亿,周富裕紧急澄清出品子弹财观1月12日消息,国内休闲食品上市公司周黑鸭的股价在最近两天发生了剧烈波动,1月11日其股价单日下跌了22。95,1月10日的收盘价还是5。84港元,到1月11日收盘时,国字号文件助力眼健康升级,千亿级眼科医疗市场释放活力自去年年底以来,随着我国防疫政策不断优化调整,以稳增长促消费为目标,各项利好政策不断出炉,消费市场逐步回暖,为各个行业的高质量发展注入新活力。尤其是在眼科医疗板块,近日,扩大内需战山东省将实施十大行动助力高校毕业生就业创业工人日报中工网记者田国垒通讯员范洪艳陈国欣1月11日,记者从山东省人力资源和社会保障厅了解到,该厅联合省教育厅联合印发通知,决定实施2023届高校毕业生就业创业启航扬帆计划,开展思