wx 仅在鼠标悬停时执行,而不是在 GUI 初始化期间执行

问题描述 投票:0回答:1

基本情况

在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)

我怎样才能做到这一点?

lambda wxpython wxwidgets mouseover functools
1个回答
0
投票

在框架和控件完全初始化并显示所有内容后,您可以尝试“绑定”“进入窗口”和“离开窗口”事件。

类似以下内容:

frame = MyFrame(......)
frame.Show()
frame.DoBindEvents()
......
© www.soinside.com 2019 - 2024. All rights reserved.