2011-05-26 54 views
3

我的wxPython应用程序使用wx.ScrolledWindow作为主要的绘图区域 - 直接从演示中取出并侵入我的需求。当用户双击滚动区域时,我想弹出一个(可能是模态)对话框来编辑他们绘制的东西的参数。所以我弹出了另一个演示代码的对话框:防止wxPython事件击中多个窗口?

def OnLeftDoubleClickEvent(self, event): 
    dlg = TestDialog(self, -1, "Sample Dialog", size=(350, 200), 
        #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, 
        style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX 
        ) 
    dlg.CenterOnScreen() 

    # this does not return until the dialog is closed. 
    val = dlg.ShowModal() 

这只是一个测试,当然。对话本身在其中一个演示中进行了严格的定义。无论如何,在关闭弹出窗口后,ScrolledArea会跳转到新的位置,并且在Windows上,鼠标事件不再映射到正确的坐标。只有当您移动弹出窗口时才会发生位移,以便您在鼠标单击滚动区域的区域之外单击以关闭它。请记住,“确定”和“取消”与滚动区域处于完全不同的对话框中。在Linux上,滚动区域会根据鼠标点击区域外的距离而发生移动 - 并且方向相同。在Windows上,滚动的区域会移动并发生混淆 - 进一步的鼠标点击也会取代它,并且(因为?)点击记录在错误的位置。

因此,Linux版本的问题似乎表明,弹出窗口上的单击事件实际上是由原始窗口中的滚动区域处理的。

这听起来像是怎么回事?

如果是这样,我该如何防止这种情况发生?

编辑:更多信息。 我尝试通过切换到“确定”或“取消”按钮来关闭弹出窗口。每次焦点移动到另一个控件时,其他窗口中的滚动区域都会移动。这取决于弹出窗口相对于其他窗口的位置。我现在完全困惑。

编辑2:我在主窗口的菜单中添加了一个选项来触发弹出对话框。以这种方式激活时,似乎没有任何问题。我认为这个问题在某种程度上是由于在滚动区域的双击事件中创建了一个弹出窗口,导致一些事件被两者处理。那有意义吗?当我有时间时,我会尝试向父对话框发送一个事件(自定义?),并将它映射到与新菜单项相同的功能。这将导致我的弹出窗口来自主窗口,并希望能够消除这个问题。我们拭目以待。

EDIT3测试用例

看到这一点,采取文件:从演示ScrolledWindow.py,添加以下内容:

from Dialog import * 

然后在MyCanvas类的鼠标事件区域,用下面的方法绑定双击:

self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClickEvent) 

然后将下面的函数添加到同一个类(取自对话框演示):

def OnLeftDoubleClickEvent(self, event): 
    useMetal = False 
    if 'wxMac' in wx.PlatformInfo: 
     useMetal = self.cb.IsChecked() 

    dlg = TestDialog(self, -1, "Sample Dialog", size=(350, 200), 
        #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, 
        style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX, 
        useMetal=useMetal, 
        ) 
    dlg.CenterOnScreen() 

    # this does not return until the dialog is closed. 
    val = dlg.ShowModal() 

    if val == wx.ID_OK: 
     self.log.WriteText("You pressed OK\n") 
    else: 
     self.log.WriteText("You pressed Cancel\n") 

    dlg.Destroy() 

现在运行演示并选择Core Windows/Controls和“ScrolledWindow”。您可以像往常一样在滚动区域上涂鸦,但现在您可以在该处双击并弹出对话框。请将该新对话框移到绘图区域外,然后在输入框周围标签,或单击确定。此对话框中的活动将导致其他窗口中的可滚动图形改变位置。

而你有它。这是什么造成的?我已经调整了演示来绘制自己的自定义对象,并且我希望能够双击来调出对象属性对话框。这是一个错误还是错误的方式? Edit2的计划更像是“正确的方式”吗?

+0

我在演示中双击时没有看到此问题。你能提供一个小问题的可运行例子吗? – 2011-06-01 14:10:59

+0

为了清楚起见,我的编辑器基于滚动区域演示(绘制事物的地方),上面的代码片段放置在滚动区域的dclick事件中,并弹出一个对话框,也从演示中获取。演示本身没有这个组合。我会看看我是否可以制作一个缩减的测试用例。您必须将对话框移到滚动区域外才能看到问题。 – phkahler 2011-06-02 13:22:47

回答

0

解决方案原来是我在Edit2中提出的。我不确定为什么,但是在ScrolledArea DoubleClick事件中执行弹出操作会导致问题。解决方案是创建一个自定义消息,并在双击事件中将其发送给自己。自定义事件由顶层窗口处理,而不是滚动区域。这工作正常,但现在我必须将所选对象的ID存储在某处,以便顶级窗口可以将它传递给对话框。这是稍微多一点的工作,但它比在绘图区域的双击事件内弹出一个窗口感觉更“正确”。然而,窗口仍然在事件处理程序中弹出,它只是一个不同的对象,处理它与一个不同的事件。为什么这项工作的具体细节仍然没有我。

我确定有一种思考方式,使得这个解决方案显然是正确的。我仍然会投票回答一个答案,提供洞察为什么一种方法有效,而不是另一种,或者什么是“正确”的方式来做这种类型的事情。

在其他消息中,我在此问题的+50赏金过期后发布此消息。是的,我在尝试自己的想法之前发布了一个赏金 - 傻了我。下次我会在提供赏金之前尝试wxPython邮件列表,尽管我不喜欢邮件列表。