我的wxPython应用程序使用wx.ScrolledWindow作为主绘图区域 - 直接从演示中取出并攻击我的需求。当用户双击滚动区域时,我想弹出一个(可能是模态的)对话框来编辑他们绘制的东西的参数。所以我通过另一个演示代码弹出一个对话框:
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版本的问题似乎表明弹出窗口上的click事件实际上是由原始窗口中的滚动区域处理的。
这听起来像是发生了什么吗?
如果是这样,我该如何防止这种情况发生?
编辑:更多信息。 我尝试通过Tab键选择OK或Cancel按钮来关闭弹出窗口。每次焦点移动到另一个控件时,另一个窗口中的滚动区域移动。这取决于弹出窗口相对于其他窗口的位置。我现在完全糊涂了。
EDIT2:我在主窗口的菜单中添加了一个选项来触发弹出对话框。以这种方式激活时,似乎没有任何问题。我认为问题是由于在滚动区域的双击事件中创建弹出窗口导致一些事件被两者处理。那有意义吗?当我有时间时,我将尝试向父对话框发送一个事件(自定义?)并将其映射到新菜单项所执行的功能。这将导致我的弹出窗口来自主窗口,并希望消除问题。我们会看到。
EDIT3 TEST CASE
要查看此内容,请从演示中获取文件:ScrolledWindow.py,添加以下内容:
from Dialog import *
然后在MyCanvas类的鼠标事件区域中,双击绑定:
self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDoubleClickEvent)
然后将以下函数添加到同一个类中(取自Dialog演示):
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 :(得分:0)
解决方案原来是我在Edit2中提出的。我不确定原因,但是从ScrolledArea DoubleClick事件中弹出窗口会导致问题。解决方案是创建自定义消息并将其发送到双击事件中的self。自定义事件由顶级窗口处理,而不是滚动区域。这工作正常,但现在我必须将所选对象的ID存储在某处,以便顶级窗口可以将其传递给对话框。这稍微有些工作,但感觉比在绘图区域的双击事件中弹出一个窗口感觉更“正确”。但是,窗口仍然在事件处理程序中弹出,它只是一个处理不同事件的不同对象。为什么这个工作的具体细节仍然无法实现。
我确信有一种思考方式可以使这个解决方案明显正确。我仍然会投票给出一个答案,这个答案可以深入了解一种方法为什么起作用而不是另一种方法,或者做出此类事情的“正确”方法是什么。
在其他新闻中,我在此问题的+50赏金到期后发布此消息。是的,我在尝试自己的想法之前发了一笔赏金 - 傻傻的我。下次我会在提供赏金之前尝试wxPython邮件列表,虽然我不喜欢邮件列表。