我正在尝试制作一个简单的停靠框架,它将停靠在父窗口上并跟随它。到目前为止,我有以下内容:
class DockingFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, style=wx.CAPTION)
parent.Bind(wx.EVT_MOVE, self.OnParentMove)
parent.Bind(wx.EVT_ACTIVATE, self.OnParentActivate)
parent.Bind(wx.EVT_SHOW, self.OnParentShow)
def OnParentMove(self, moveEvent):
print "Docked frame parent moved"
pr = positioning.position(
self.Rect,
my='right_top', at='left_top', of=self.Parent.Rect)
self.Move(pr.top_left)
moveEvent.Skip()
def OnParentActivate(self, event):
print "Docked frame parent activated"
self.Raise()
event.Skip()
def OnParentShow(self, event):
print "Docked frame parent showed"
self.Show(event.GetShow())
event.Skip()
class MainFrame(wx.Frame):
def __init__(self, title):
wx.Frame.__init__(self, None, title=title)
self.info_frame = DockingFrame(self)
self.Show(True)
这适用于如果我移动父窗口,停靠窗口随之移动,如果我单击父窗口,停靠窗口会自动升起。但是,它会严重干扰父窗口的功能。我不能再关闭或重新调整父窗口的大小,每当我点击父窗口时,我都会收到大量“Docked frame parent activated”消息。在这里,我似乎并不了解一些基本的wxPython概念。发生了什么,我该如何解决?
我已经看到aui
似乎支持对接,但文档很少,所以我没有尝试过。如果有人可以提供一个最小的工作代码示例,说明如何使用Frame
将Frame
停靠到另一个aui
,我也可以采用这种方法。
请注意,我在此应用中也使用pygame
和twisted
,这可能会或可能不会干扰此处......
答案 0 :(得分:2)
当然,简单的方法是简单地使用wx.FRAME_FLOAT_ON_PARENT
样式......
class DockingFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="Last Hand",
style=wx.CAPTION | wx.FRAME_FLOAT_ON_PARENT)
parent.Bind(wx.EVT_MOVE, self.OnParentMove)
parent.Bind(wx.EVT_SHOW, self.OnParentShow)
def SnapToParent(self):
print "*Snapping to parent"
pr = positioning.position(
self.Rect,
my='right_top', at='left_top', of=self.Parent.Rect)
self.Move(pr.top_left)
def OnParentMove(self, moveEvent):
moveEvent.Skip()
self.SnapToParent()
def OnParentShow(self, event):
event.Skip()
print "Parent %s" % ("Hide", "Show")[event.GetShow()]
self.Show(event.GetShow())
答案 1 :(得分:0)
诀窍是EVT_ACTIVATE
同时激活激活和去激活。以下代码有效。如果父母被激活,那么码头就会自动激活。之后立即提升父母。
class DockingFrame(wx.Frame):
def __init__(self, parent):
self.handleParentActiveState = 'noTriggers'
wx.Frame.__init__(self, parent, title="Last Hand", style=wx.CAPTION)
parent.Bind(wx.EVT_MOVE, self.OnParentMove)
parent.Bind(wx.EVT_ACTIVATE, self.OnParentActivate)
self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
parent.Bind(wx.EVT_SHOW, self.OnParentShow)
def OnActivate(self, event):
event.Skip()
if not event.GetActive():
return
if self.handleParentActiveState == 'activateParentNext':
self.handleParentActiveState = 'resetTriggers'
self.Parent.Raise()
def OnParentActivate(self, event):
event.Skip()
if not event.GetActive():
return
if self.handleParentActiveState == 'noTriggers':
self.handleParentActiveState = 'activateParentNext'
self.Raise()
elif self.handleParentActiveState == 'resetTriggers':
self.handleParentActiveState = 'noTriggers'
def OnParentMove(self, moveEvent):
pr = positioning.position(
self.Rect,
my='right_top', at='left_top', of=self.Parent.Rect)
self.Move(pr.top_left)
moveEvent.Skip()
def OnParentShow(self, event):
event.Skip()
self.Show(event.GetShow())