【问题标题】:Keyboard interface to wxPython listboxwxPython 列表框的键盘界面
【发布时间】:2010-12-15 14:50:29
【问题描述】:

我在 Windows 上使用 wxPython 列表框从用户那里获得选择,我希望他们能够使用 ENTER 键选择一个项目,就像他们已经双击一样。我知道如何直接使用 Windows API 在 C 或 C++ 中执行此操作,但似乎无法找到如何使用 wxPython 执行此操作。有谁知道怎么做?这似乎是一件显而易见的事情。

【问题讨论】:

    标签: python windows wxpython


    【解决方案1】:

    也许我遗漏了一些细微差别,没有太多信息可以继续,但听起来您可以通过捕获 keydown 事件、匹配输入然后调用您的 on_doubleclick 函数来完成此操作。除非有隐式的双击处理,否则你应该很高兴。

    【讨论】:

    • 我试过了,但我似乎没有捕捉到指向列表框的键盘事件。
    • 您是否将事件绑定到正确的对象上?问题是如果你这样做self.Bind(...),那么列表框可能会在容器得到它之前吃掉它。如果您在self.listbox 中有参考,那么self.listbox.Bind(...) 可能是解决方案。
    • 您可以从列表框中获取关键事件(请参见演示中的示例),但在这种情况下,问题是通常在我们为其生成关键事件之前抓取 ENTER 键,它可能可用作导航键或激活默认按钮(如果有)。
    【解决方案2】:

    简单的答案是 wx.ListBox 不支持。尝试改用单列 wx.ListCtrl(在报告模式下)。

    【讨论】:

    • 嗯,这有点裤子!我们不应该提供键盘接口和鼠标接口吗?无论如何,谢谢你的信息。
    • 我能说什么?我在 IRC 上问过 Robin Dunn(wxPython 的创建者),他说如果原生小部件不支持,那么 wx 不支持。向比尔盖茨抱怨的事情......
    【解决方案3】:

    这对我有用,关键是绑定EVT_KEY_UP,而不是EVT_KEY_DOWN:

    import wx
    
    class myListBoxDemo(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent=parent, title="testing ListBox right-click")
            self.panel = wx.Panel(self, -1)
            sizer = wx.BoxSizer(wx.VERTICAL)
            self.myListBox = wx.ListBox(self.panel,style=wx.LB_HSCROLL|wx.LB_SINGLE)
            self.myListBox.Bind(wx.EVT_KEY_UP, self.OnKeyDownSelectedList)
    
            self.myListBox.Append('item 1')
            self.myListBox.Append('item 2')
            self.myListBox.Append('item 3')
            self.myListBox.Append('item 4')
    
            sizer.AddF(self.myListBox, wx.SizerFlags(1).Expand())
            self.panel.SetSizer(sizer)
    
        def OnKeyDownSelectedList(self, event):
            print "KeyCode: %d" % event.GetKeyCode()
            print "ListBox Item Index: %d" % event.GetEventObject().GetSelection()
    
    import wx.lib.mixins.inspection as wit
    class AppWInspection(wx.App, wit.InspectionMixin):
        def OnInit(self):
            self.Init()  # enable Inspection tool
            return True
    
    if __name__ == "__main__":
        app = AppWInspection()    
        f = myListBoxDemo(None)
        f.Show()
        app.MainLoop()  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多