wxPython wx.PopupWindow实现鼠标滑入划出效果
最近想学习用wxPython做个桌面小工具,想要做一个鼠标滑入滑出显示和取消弹窗的效果(跨越两个控件不消失),网上查了很久只找到了一个用wx.PopupWindow实现的例子,效果不是很理想,在例子的基础上改了半天终于弄出一个勉强能实现功能的,非常高兴,记录一下,希望各位大神帮忙看看有什么好的建议,非常感谢!!
废话不多说,先上代码。
1 #python 3.6.0 64 2 #wxPython 4.0.1 3 import wx 4 5 #关闭状态 6 audio_status=0 7 8 #弹窗子窗口 9 class TestPopup(wx.PopupWindow): 10 def __init__(self, parent, style): 11 wx.PopupWindow.__init__(self, parent, style) 12 13 #滑块 14 self.m_slider2 = wx.Slider( self, wx.ID_ANY, 50, 0, 100, wx.DefaultPosition, wx.DefaultSize, wx.SL_BOTH|wx.SL_INVERSE|wx.SL_LEFT ) 15 sz = self.m_slider2.GetBestSize() 16 self.SetSize( (sz.width+5, sz.height+10) ) 17 self.m_slider2.SetSize( (sz.width+5, sz.height+10) ) 18 19 #绑定滑入事件 20 self.m_slider2.Bind( wx.EVT_ENTER_WINDOW, self.onenter) 21 #绑定滑出事件 22 self.m_slider2.Bind( wx.EVT_LEAVE_WINDOW, self.onleave) 23 24 #滑入后执行 25 def onenter(self,event): 26 global audio_status 27 audio_status=1 28 29 #滑出后执行 30 def onleave(self,event): 31 global audio_status 32 audio_status=0 33 34 #主窗口 35 class TestPanel(wx.Panel): 36 def __init__(self, parent): 37 wx.Panel.__init__(self, parent) 38 39 #主窗口按钮 40 btn = wx.Button(self, label="Open Popup") 41 42 #绑定滑入事件 43 btn.Bind( wx.EVT_ENTER_WINDOW, self.onShowPopup) 44 45 #绑定滑出事件 46 btn.Bind( wx.EVT_LEAVE_WINDOW, self.onleave) 47 48 #设置定时事件 49 self.slider_timer = wx.Timer(self) 50 51 #绑定事件 52 self.Bind(wx.EVT_TIMER, self.destroy,self.slider_timer) 53 #每0.1秒执行一次 54 self.slider_timer.Start(100) 55 56 #滑出后执行 57 def onleave(self,event): 58 global audio_status 59 audio_status=0 60 61 #定时事件执行 62 def destroy(self,event): 63 #状态为0时关闭弹窗 64 if audio_status==0: 65 try: 66 self.win.Show(False) 67 self.win.Destroy() 68 except: 69 pass 70 71 #滑入后执行 72 def onShowPopup(self, event): 73 try: 74 self.win.GetTopLevelParent() 75 except: 76 self.win = TestPopup(self.GetTopLevelParent(), wx.SIMPLE_BORDER) 77 btn = event.GetEventObject() 78 pos = btn.ClientToScreen( (0,0) ) 79 sz = btn.GetSize() 80 #设置弹窗的位置 81 self.win.Position((pos[0]+30,pos[1]-140), (0, sz[1])) 82 self.win.Show(True) 83 global audio_status 84 audio_status=1 85 86 class TestFrame(wx.Frame): 87 def __init__(self): 88 wx.Frame.__init__(self, None, title="Test Popup") 89 panel = TestPanel(self) 90 self.Show() 91 92 if __name__ == "__main__": 93 app = wx.App(False) 94 frame = TestFrame() 95 app.MainLoop()
效果图:

打完收工。

浙公网安备 33010602011771号