基本完成了iTip主窗口界面的设计。主窗口的主要功能有:
- 添加便笺
- 浏览便笺
- 删除便笺
- 锁定窗体
- 设置提醒
这个看似简洁的界面其实隐藏了很多控件,比如左下角的闹钟,只有鼠标放上去的时候才会出现,而点击小闹钟才会出现设置时间的控件。大量使用控件的Hide()和Show()方法才能使得窗体简洁。在设计过程中,有一个问题让我花费了大量的时间。
为了实现闹钟在鼠标放上去的时候显示,离开的时候消失的功能,我使用了EVT_ENTER_WINDOW和EVT_LEAVE_WINDOW这两个鼠标事件,其中EVT_ENTER_WINDOW由ViewON函数处理,EVT_LEAVE_WINDOW由ViewOff函数处理,我将这两个事件都绑定在了闹钟控件上。
... ...
self.alarmclock.Bind(wx.EVT_ENTER_WINDOW, self.ViewON)
self.alarmclock.Bind(wx.EVT_LEAVE_WINDOW, self.ViewOFF)
... ...
def ViewON(self,event):
self.Clock.Show()
def ViewOff(self,event):
self.Clock.Hide()
调试的时候傻眼了,鼠标离开控件,闹钟消失了,但是鼠标再放上去,闹钟却回不来了…这是怎么回事?从代码的逻辑上看来似乎没有问题,但哪里出问题了?试了很久才发现,原来这个Hide()的方法不是我想象中的invisible,而是disappear!当鼠标触发了EVT_LEAVE_WINDOW事件的时候,Clock执行了Hide()方法之后就消失了。一个不存在的控件怎么可能再会触发EVT_ENTER_WINDOW事件呢?所以ViewON函数永远也不会执行,闹钟自然也不会回来了。
了解了原因,那就来个解决办法。将Clock控件放置在了一个比它面积稍大的Panel控件上,并将事件做如下绑定
self.Panel.Bind(wx.EVT_ENTER_WINDOW, self.ViewON)
self.alarmclock.Bind(wx.EVT_LEAVE_WINDOW, self.ViewOff)
当鼠标进入到Panel的时候,闹钟就会显示,因为Panel的面积只比Clock稍微大一点点,所以鼠标位置基本停留在了Clock上,当鼠标离开Clock控件的时候,触发ViewOff事件,Clock消失~~问题解决!
总结:窗口界面Sizer的设计把我楸死了,虽然有wxGlade,但为了放控件要Sizer套Sizer,乖乖,想要把控件弄成想象中的布局费劲了功夫了!!其中有个Expand属性的调整最烦人,尤其是Sizer套的多的时候,加上我要隐藏控件,布局调整直接要死人了~~囧
发表回复