wx.StaticText 静态文本,实现超链接是假的,它没有支持的事件类型,不具有任何可操作属性,最终实现的是用 wx.TextCtrl 实现,但是把它模拟成静态文本的样子,最终实现超链接。
先看模拟部分,就是在TextCtrl初始化的时候 style 添加 wx.TE_READONLY 和 wx.BORDER_NONE 属性,并且设置TextCtrl的背景色与框架背景色相同,这样 TextCtrl 在界面上显示和静态文本一模一样。
参考文章:python wx中 TextCtrl 实现与 StaticText 相似的显示效果
下一步,实现 TextCtrl的超链接功能。先看一下 TextCtrl 支持的事件类型:
—————————————————————–
EVT_TEXT:文本因用户的输入或在程序中使用SetValue()而被改变,都要产生该事件。
EVT_TEXT_ENTER:当用户在一个wx.TE_PROCESS_ENTER样式的文本控件中按下了回车键时,产生该事件。
EVT_TEXT_URL:如果在Windows系统上,wx.TE_RICH或wx.TE_RICH2样式被设置了,并且wx.TE_AUTO_URL样式也被设置了,那么当在文本控件内的URL上发生了一个鼠标事件时,该事件被触发。
EVT_TEXT_MAXLEN:如果使用SetMaxLength()指定了该控件的最大长度,那么当用户试图输入更长的字符串时,该事件被触发。例如,这时给用户显示一个警告消息。
—————————————————————–
注意我标红的 EVT_TEXT_URL 事件,“发生了一个鼠标事件时”,表明它是可以由鼠标点击触发的,不幸的是,鼠标移动到这里也会触发事件,所以当我做了就打开网页的实现后,一点开测试,瞬间打开了十几个网页。这时候,就需要在动作实现中添加鼠标判断函数:GetMouseEvent().LeftIsDown().即,当鼠标左键按下时才会执行超链接。同时,在初始化函数中添加 wx.TE_RICH和wx.TE_AUTO_URL样式,就可以实现StaticText的超链接功能了。
附源码:
- class MyDialog(wx.Dialog):
- def __init__(self,parent,text):
- wx.Dialog.__init__(self,parent,-1,u”版本信息”,pos=wx.DefaultPosition, size=(500,300))
- sizer = wx.GridSizer(rows=5,cols=1)
- label_1 = wx.StaticText(self,-1,text)
- label_1.SetFont(wx.Font(14,wx.DEFAULT,wx.NORMAL,wx.BOLD))
- label_2 = wx.StaticText(self, -1, u”软件版本:V1.0 (2018.03.01)”)
- label_2.SetFont(wx.Font(12,wx.DEFAULT,wx.NORMAL,wx.NORMAL))
- label_3 = wx.StaticText(self, -1, u”版权所有:maydolly”)
- label_3.SetFont(wx.Font(12,wx.DEFAULT,wx.NORMAL,wx.NORMAL))
- label_4 = wx.TextCtrl(self, -1, u”联系作者:www.classnotes.cn”, size=(300,-1),
- style=wx.TE_READONLY|wx.TE_AUTO_URL|wx.TE_RICH|wx.BORDER_NONE)
- label_4.SetFont(wx.Font(12,wx.DEFAULT,wx.NORMAL,wx.NORMAL))
- label_4.SetBackgroundColour(self.BackgroundColour)
- label_4.Bind(wx.EVT_TEXT_URL, self.OnButton)
- self.number = 1
- okbtn = wx.Button(self,wx.ID_OK,”OK”)
- okbtn.SetDefault()
- sizer.Add(label_1,flag=wx.ALIGN_CENTER)
- sizer.Add(label_2,flag=wx.ALIGN_CENTER)
- sizer.Add(label_3,flag=wx.ALIGN_CENTER)
- sizer.Add(label_4,flag=wx.ALIGN_CENTER)
- sizer.Add(okbtn, flag=wx.ALIGN_CENTER)
- self.SetSizer(sizer)
- def OnButton(self, evt):
- if evt.GetMouseEvent().LeftIsDown():
- webbrowser.open(“http://www.classnotes.cn”)