wxpython:为什么可以';按下Shift键时是否签入wx.CheckListBox?

wxpython:为什么可以';按下Shift键时是否签入wx.CheckListBox?,wxpython,keyevent,checklistbox,Wxpython,Keyevent,Checklistbox,我打算在按下shift键时进行一系列选择。但是,当按下shift键时,不会触发wx.EVT_复选框。以下是我的代码: import wx class MyFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, -1, "Different Frame", size=(300, 300)) panel = wx.Panel(self) size

我打算在按下shift键时进行一系列选择。但是,当按下shift键时,不会触发wx.EVT_复选框。以下是我的代码:

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Different Frame", size=(300, 300))
        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.prevIndex = None
        self.shift_down = False
        self.level = wx.CheckListBox(panel, -1)
        levels = ["%s" % i for i in range(9)]
        self.level.SetItems(levels)
        self.level.Bind(wx.EVT_CHECKLISTBOX, self.OnSelectLevel)
        self.level.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
        self.level.Bind(wx.EVT_KEY_UP, self.onKeyUp)

        panel.SetSizer(sizer)
        self.Centre()
        self.Show()

    def onKeyDown(self, event):
        print("onKeyDown")
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_SHIFT:
            self.shift_down = True
        else:
            event.Skip()

    def onKeyUp(self, event):
        print("onKeyUp")
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_SHIFT: 
            self.shift_down = False
        else:
            event.Skip()

    def OnSelectLevel(self, evt):
        print("OnSelectLevel")
        currindex = evt.GetInt()
        currCheckedItems = self.level.GetCheckedItems()
        if self.prevIndex != None and self.shift_down == True:
            if currindex > self.prevIndex:
                newrange = list(range(self.prevIndex, currindex))
            else:
                newrange = list(range(currindex, self.prevIndex, -1))
            newCheckedItems = currCheckedItems + newrange
            self.level.SetCheckedItems(newCheckedItems)
            self.prevIndex = currindex
            evt.Skip()

app = wx.App(0)
frame = MyFrame(None)
frame.Show()
app.MainLoop()

是否仍有触发事件wx的方法。按下shift键时EVT_复选框?谢谢。

您的属性
self.prevIndex
从未设置过。 尝试此修改:

def OnSelectLevel(self, evt):
    currindex = evt.GetInt()
    currCheckedItems = list( self.level.GetCheckedItems() )
    if self.prevIndex != None and self.shift_down == True:
        if currindex > self.prevIndex:
            newrange = list(range(self.prevIndex, currindex))
        else:
            newrange = list(range(currindex, self.prevIndex, -1))
        newCheckedItems = currCheckedItems + newrange
        self.level.SetCheckedItems(newCheckedItems)
    self.prevIndex = currindex
    evt.Skip()
此外,使用
wx.GetKeyState(wx.WXK\u Shift)
,只需在SelectLevel上检查是否按下了Shift键就更容易了


通常,我总是建议使用好的调试器,并在事件处理程序处设置断点。然后你就可以交互式地检查事物并逐步完成。

@Dietmar Schwertberger:你说的对,prevIndex从未设置过。但这里的问题是,当我按下shift键并尝试检查一个项目时,该项目将不会被检查(按下shift键时无法打印文本“OnSelectLevel”)。请说明您的平台。在Windows上,它工作正常。如果它在您的平台上不起作用,您可能需要找到一个解决方法(例如,过滤事件并将修改过的事件发布到控件。也许,一个sizer和复选框是更简单的解决方案…我在两个平台上测试了相同的问题。一个是Darwin,python 3.6.5 Anaconda,4.0.3 osx cocoa(phoenix)wxWidgets 3.0.5。另一个是Linux、Python 3.5.6、4.0.3 gtk3(凤凰城)wxWidgets 3.0.5.在Windows上,wx使用了checklistbox的一个通用实现。源代码请参见此处:该实现在不检查移位的情况下处理EVT_LEFT_DOWN。在gtk上,本机checklistbox似乎可用并正在使用。如果本机小部件忽略移位单击,则您只有三种方法:-尝试筛选事件and在小部件上发布一个非Shift单击;我不确定这是否会起作用-自己实现一个类似于CheckListBox的小部件;可能使用Windows实现作为基础,但在Python中实现…-使用一个不同的小部件,如网格,它可以更好地控制事件如果你自己找不到解决方案,我建议在wxPython邮件列表。