Wxpython wxWidgets:如何捕获左键单击WXLISTCRL?
我想将复选框添加到WXLISTCRL,这可以正常工作,但似乎没有EVT_列表_项_单击或EVT_列表_项_左键单击事件,以便在鼠标单击该项时捕获,以便切换图像。有右键和中键单击的事件,而不是左键单击-这意味着您必须中键或右键单击来勾选/取消勾选列表中的项目 是否有人知道您是否可以使用左键单击事件?我尝试了“项目选定”和“项目激活”事件,但这些事件不报告事件的像素位置,因此我无法使用它们来确定图像是否是单击的项目的一部分 我当时是基于一些代码的,除了为了简单起见,它们重写了wxListCtrl类。我也知道wxGrid和其他替代控件,但它们都不如wxListCtrl快(而且wxGrid复选框看起来也很糟糕) 那么,有人知道如何在wxListCtrl中获得左键单击的坐标吗Wxpython wxWidgets:如何捕获左键单击WXLISTCRL?,wxpython,wxwidgets,Wxpython,Wxwidgets,我想将复选框添加到WXLISTCRL,这可以正常工作,但似乎没有EVT_列表_项_单击或EVT_列表_项_左键单击事件,以便在鼠标单击该项时捕获,以便切换图像。有右键和中键单击的事件,而不是左键单击-这意味着您必须中键或右键单击来勾选/取消勾选列表中的项目 是否有人知道您是否可以使用左键单击事件?我尝试了“项目选定”和“项目激活”事件,但这些事件不报告事件的像素位置,因此我无法使用它们来确定图像是否是单击的项目的一部分 我当时是基于一些代码的,除了为了简单起见,它们重写了wxListCtrl类。
编辑:对不起,wxListCtrl不是wxListGrid(我对wxGrid想得太多了…这是我第一次听说wxListGrid,所以我不知道它能做什么。但是,通常您可以捕获低级鼠标单击事件(例如,
EVT_LEFT_UP
),并在鼠标位置下方找到项目。以下是我从列表中捕获的事件Ctrl用于左键单击和双击:
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnListClick, self.ballotC)
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnListDClick, self.ballotC)
你可以看到一个例子。我很困惑。您应该能够像其他任何小部件一样绑定到EVT_LEFT_DOWN。我刚试过,它对我有效。请参见以下示例:
导入wx
类MyForm(wx.Frame):
定义初始化(自):
Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#添加一个面板,使其在所有平台上看起来都正确
panel=wx.panel(self,wx.ID_ANY)
self.index=0
self.list_ctrl=wx.ListCtrl(面板,大小=(-1100),
style=wx.LC\u报告
|wx.BORDER_凹陷
)
self.list\u ctrl.InsertColumn(0,“主题”)
self.list\u ctrl.InsertColumn(1,“到期”)
self.list\u ctrl.InsertColumn(2'位置',宽度=125)
self.list\u ctrl.Bind(wx.EVT\u LEFT\u DOWN,self.onLeftClick)
btn=wx.按钮(面板,标签=“添加行”)
btn.Bind(wx.EVT_按钮,self.add_行)
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.list_ctrl,0,wx.ALL | wx.EXPAND,5)
添加(btn,0,wx.ALL | wx.CENTER,5)
面板设置器(施胶器)
def添加_行(自身、事件):
line=“行%s”%self.index
self.list\u ctrl.InsertStringItem(self.index,行)
self.list_ctrl.SetStringItem(self.index,1,“01/19/2010”)
self.list_ctrl.SetStringItem(self.index,2,“美国”)
自索引+=1
def onLeftClick(自我,事件):
pos=event.GetPosition()
打印str(pos)
我希望这有帮助
迈克·德里斯科尔
博客:很抱歉,这是一个打字错误,本来是WXLISTCRL。我确实尝试捕获EVT_LEFT_UP和EVT_LEFT_DOWN事件,但这些事件从未由wxListCtrl发送,因此代码从未运行。您应该真正使用为此类选择的
EVT_列表项目和wxGetMousePosition()
来获取鼠标位置(与选择事件不完全相同,但应该足够接近)。感谢您的建议-这些是我在问题中提到的已选择的项目和已激活的项目事件,但当我使用它们时,命令“print event.GetPosition()”会显示(0,0)对我来说,无论点击发生在哪里,我都不能使用它们。你从这些事件中获得坐标吗?我不知道你是否能获得这些事件的位置。我建议编辑你的问题标题和最后一句话,以明确你在寻找左击的坐标。对不起,我看不到你在哪里打印X和X鼠标点击的Y坐标?或检测鼠标是否点击了图像而不是项目上的任何其他位置的任何其他方法。请参阅onLeftClick方法。使用“event.GetPosition()”获取鼠标位置,并使用“print str(pos)”打印出来
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial", size=(500,500))
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
self.index = 0
self.list_ctrl = wx.ListCtrl(panel, size=(-1,100),
style=wx.LC_REPORT
|wx.BORDER_SUNKEN
)
self.list_ctrl.InsertColumn(0, 'Subject')
self.list_ctrl.InsertColumn(1, 'Due')
self.list_ctrl.InsertColumn(2, 'Location', width=125)
self.list_ctrl.Bind(wx.EVT_LEFT_DOWN, self.onLeftClick)
btn = wx.Button(panel, label="Add Line")
btn.Bind(wx.EVT_BUTTON, self.add_line)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
def add_line(self, event):
line = "Line %s" % self.index
self.list_ctrl.InsertStringItem(self.index, line)
self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010")
self.list_ctrl.SetStringItem(self.index, 2, "USA")
self.index += 1
def onLeftClick(self, event):
pos = event.GetPosition()
print str(pos)