基本情况
在wxPython中,我有一个
wx.lib.sized_controls.SizedFrame()
作为类对象,它包含一个带有wx.lib.sized_controls.SizedScrolledPanel()
和SetSizerProps(expand=True, proportion=9)
的SetSizerType('grid', {'cols': 14, 'hgap': 1, 'vgap': 1})
。
所以它是一个基于网格大小调整器的自扩展和对齐 GUI,带有滚动条。它运行完美。
目前的做法
在 GUI 内,我一次构建一行内容。每行都以一个显示“排名”的 StaticText 对象开始。当我用鼠标悬停文本时,我希望显示一个弹出窗口。我目前在循环中创建它,如下所示:
# Define and set rank
rank = wx.StaticText(self.sp, label=cdc.get_rank(result, result[7]))
rank.Bind(wx.EVT_ENTER_WINDOW, self.on_enter_field(conf.DATABASE_NAME_1, result[7], rank, "Rank", "Rank"))
rank.Bind(wx.EVT_LEAVE_WINDOW, mm.on_mouse_leave())
这是有效的,因为当我将鼠标悬停在 GUI 中的 wx.StaticText 对象上时,将调用 self.on_enter_field() 方法并且弹出窗口会正确显示。
问题
但是,问题是,当我以这种方式创建它时,在执行脚本时会多次调用
self.on_enter_field()
。对于在 GUI 中创建的每一行,都会初始化该方法。
需要的结果
我想要的是 on_enter_field() 方法仅在鼠标悬停在 wx.StaticText() 字段上时初始化,而不在 GUI 创建过程中初始化。
尝试失败
我尝试了以下两种方法,都失败了,因为当我以这些方式尝试时,该方法根本没有初始化:
尝试 1 失败(使用 functools)
import functools
# Define and set rank
rank = wx.StaticText(self.sp, label=cdc.get_rank(result, result[7]))
rank.Bind(wx.EVT_ENTER_WINDOW, functools.partial(self.on_enter_field, coin_id=result[7], field=rank, field_name="Rank", category="Rank"))
rank.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave)
尝试 2 失败(使用 lambda 函数)
# Define and set rank
rank = wx.StaticText(self.sp, label=cdc.get_rank(result, result[7]))
rank.Bind(wx.EVT_ENTER_WINDOW, lambda event, field=rank: self.on_enter_field(event, result[7], field, "Rank", "Rank"))
rank.Bind(wx.EVT_LEAVE_WINDOW, self.on_mouse_leave)
我怎样才能做到这一点?
在框架和控件完全初始化并显示所有内容后,您可以尝试“绑定”“进入窗口”和“离开窗口”事件。
类似以下内容:
frame = MyFrame(......)
frame.Show()
frame.DoBindEvents()
......