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()

效果图:

打完收工。

posted @ 2018-05-17 22:31  极致的无奈  阅读(869)  评论(0)    收藏  举报