xsmile
You can fly higher
xsmile's Blog
iTip开发笔记三
http://www.xsmile.net/image/itip1-150x150.jpg
http://www.xsmile.net/image/itip21-150x150.jpg

基本完成了iTip主窗口界面的设计。主窗口的主要功能有:

  • 添加便笺
  • 浏览便笺
  • 删除便笺
  • 锁定窗体
  • 设置提醒

这个看似简洁的界面其实隐藏了很多控件,比如左下角的闹钟,只有鼠标放上去的时候才会出现,而点击小闹钟才会出现设置时间的控件。大量使用控件的Hide()和Show()方法才能使得窗体简洁。在设计过程中,有一个问题让我花费了大量的时间。

为了实现闹钟在鼠标放上去的时候显示,离开的时候消失的功能,我使用了EVT_ENTER_WINDOWEVT_LEAVE_WINDOW这两个鼠标事件,其中EVT_ENTER_WINDOWViewON函数处理,EVT_LEAVE_WINDOWViewOff函数处理,我将这两个事件都绑定在了闹钟控件上。

... ...
    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套的多的时候,加上我要隐藏控件,布局调整直接要死人了~~囧

首页      技术      Python      iTip开发笔记三

发表回复

textsms
account_circle
email

xsmile's Blog

iTip开发笔记三
基本完成了iTip主窗口界面的设计。主窗口的主要功能有: 添加便笺 浏览便笺 删除便笺 锁定窗体 设置提醒 这个看似简洁的界面其实隐藏了很多控件,比如左下角的闹钟,只有鼠标…
扫描二维码继续阅读
2008-11-10