gpt4 book ai didi

event-handling - 防止 wxPython 事件命中多个窗口?

转载 作者:行者123 更新时间:2023-12-02 05:10:28 26 4
gpt4 key购买 nike

我的 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版本的问题似乎表明弹出窗口上的点击事件实际上是由原始窗口中的滚动区域处理的。

这听起来像是正在发生的事情吗?

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

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

EDIT2:我在主窗口的菜单中添加了一个选项来触发弹出对话框。这样激活的时候,好像没有什么问题。我认为问题是由于在滚动区域的双击事件中创建弹出窗口导致某些事件由两者处理。那有意义吗?当我有时间时,我将尝试向父对话框发送一个事件(自定义?)并让它映射到与新菜单项相同的功能。这将导致我的弹出窗口来自主窗口,并有望消除该问题。我们拭目以待。

EDIT3 测试用例

要查看此文件,请从演示中获取文件:ScrolledWindow.py,添加以下内容:

from Dialog import *

然后在 MyCanvas 类的鼠标事件区域中,绑定(bind)双击:

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”。您将能够像往常一样在滚动区域上涂鸦,但现在您可以双击那里,它会弹出一个对话框。请将该新对话框移到绘图区域之外,然后在输入框周围使用 Tab 键或单击“确定”。此对话框中的事件将导致另一个窗口中的可滚动绘图改变位置。

就是这样。是什么原因造成的?我已经修改了演示以绘制我自己的自定义对象,并且我希望能够双击以显示对象属性对话框。这是一个错误,还是错误的解决方法?我在 Edit2 中的计划更像是“正确的方式”吗?

最佳答案

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

我确信有一种思考方式可以使这个解决方案显然是正确的。我仍然会投票支持一个答案,该答案提供了为什么一种方法有效而另一种方法无效的见解,或者做这种事情的“正确”方法是什么。

在其他新闻中,我是在这个问题的 +50 赏金到期后发布的。是的,我在尝试自己的想法之前发布了赏金 - 愚蠢的我。下次我会在提供赏金之前尝试 wxPython 邮件列表,尽管我不喜欢邮件列表。

关于event-handling - 防止 wxPython 事件命中多个窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com