Py学习  »  Python

WXPython:当shift键被按下时,为什么我不能在WX.CuthListBox中签入?

HuongOrchid • 4 年前 • 92 次点击  

我打算在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 U复选框?谢谢您。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43412
 
92 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Dietmar Schwertberger
Reply   •   1 楼
Dietmar Schwertberger    5 年前

你的属性 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()

另外,在selectlevel上检查shift键是否被按下也更容易 wx.GetKeyState(wx.WXK_SHIFT) .

一般来说,我总是建议使用一个好的调试器并在事件处理程序上设置一个断点。然后,你可以交互式地检查事物并逐步通过。