使用修饰符在ListCtrl中单击项目

时间:2017-07-27 08:59:31

标签: python wxpython

我有一个具有单选模式的虚拟ListCtrl。现在我想在listitems上自定义点击次数,班次点击次数和控制点击次数。为此,我需要在wx.EVT_LIST_ITEM_SELECTED的事件处理程序期间使用GetModifiers()。我该怎么做?

我尝试了以下内容:

1)在我的自定义ListCtrl的 init ()期间实例化self.keyboard = wx.KeyboardState()。然后在事件处理期间调用self.keyboard.GetModifiers()。

2)在事件处理期间实例化KeyboardState-class。

要测试它是否有效我只打印所有捕获的修饰符。但它始终为0(即MOD_NONE)。

我还尝试使用wx.EVT_LEFT_DOWN和wx.EVT_LEFT_UP而不是wx.EVT_LIST_ITEM_SELECTED。当我点击列表项目时,前者有同样的问题,后者甚至没有被解雇。

1 个答案:

答案 0 :(得分:0)

这会将鼠标和项目选定事件分配给同一个事件,然后使用event.Skip()确保我们同时看到这两个事件。
也许这可能会让你知道如何进步 使用Shift,Ctrl等组合,mods将根据所按的内容为您提供不同的数字。

import wx

class Myframe(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        pan = wx.Panel(self)
        self.listC = wx.ListCtrl(pan, style=wx.LC_REPORT)
        self.listC.InsertColumn(0, 'Column1', width=50)
        self.listC.InsertColumn(1, 'Column2', width=50)
        self.listC.InsertColumn(2, 'Column3', width=50)
        self.listC.Bind(wx.EVT_LEFT_DOWN, self.ListClick)
        self.listC.Bind(wx.EVT_LIST_ITEM_SELECTED, self.ListSelected)
        self.listC.InsertStringItem(0,"Item1")
        self.listC.SetStringItem(0, 1,"Col 1 Item")
        self.listC.SetStringItem(0, 2,"Col 2 Item")
        self.listC.InsertStringItem(1,"Item2")
        self.listC.SetStringItem(1, 1,"Col 1 Item")
        self.listC.SetStringItem(1, 2,"Col 2 Item")

    def ListClick(self, event):
        mods = event.GetModifiers()
        print mods
        event.Skip()

    def ListSelected(self, event):
        print "selected"

if __name__ == "__main__":
    App = wx.App()
    Myframe().Show()
    App.MainLoop()