【问题标题】:Key event detecting in grid - wxPython网格中的关键事件检测 - wxPython
【发布时间】:2019-07-18 21:29:13
【问题描述】:

我使用 wxPython 创建了一个网格,我需要监视用户插入到我网格中一个单元格中的数据。由于键盘上的每一次按键(如 EVT_KEY_DOWN),我都需要有一个事件,但我找不到这样做的方法。 现在我需要为此使用网格,所以解决方案必须是可以集成到 wx.grid 中的东西。

我尝试使用 GridCellEditor,但它只提供第一个键。 有没有办法将 TextCtrl 集成到网格的单元格或类似的东西中?

【问题讨论】:

    标签: python-3.x events text wxpython wxgrid


    【解决方案1】:

    据我所知,除非另有说明,否则网格是 TextCtrl 的集合,因此关键是将 wx.EVT_KEY_DOWN 绑定到它们。
    这是一种方法:
    注意:出于演示目的,我添加了几种不同的元素类型。
    希望这就是您所需要的。

    import wx
    import wx.grid as gridlib
    class MyForm(wx.Frame):
        def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY, "A key detecting grid", size=(1000,300))
            panel = wx.Panel(self, wx.ID_ANY)
            self.grid = gridlib.Grid(panel)
            self.grid.CreateGrid(10, 8)
            self.grid.Bind(wx.EVT_KEY_DOWN, self.OnKeyPress) #Required for initial key press
            self.grid.Bind(gridlib.EVT_GRID_EDITOR_CREATED, self.onEditorCreated) # For subsequent key presses
    
        # -- Additional bits only for demonstration of isolating Text fields
    
            # Boolean field dislays as a CheckBox
            crbool = wx.grid.GridCellBoolRenderer()
            cebool = wx.grid.GridCellBoolEditor()
            self.grid.SetCellRenderer(1, 1, crbool)
            self.grid.SetCellEditor(1, 1, cebool)
            # Choice field
            cechoice = wx.grid.GridCellChoiceEditor(['Choice 1','Choice 2','Choice 3'], allowOthers=False)
            self.grid.SetCellEditor(1, 2, cechoice)
            #Load special fields
            self.grid.SetCellValue(1, 1, '1')
            self.grid.SetCellValue(1, 2, 'Choice 2')
            self.grid.SetColSize(0,200)
            self.grid.SetColSize(2,200)
    
        # --
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.grid, 1, wx.EXPAND, 5)
            panel.SetSizerAndFit(sizer)
            self.Show()
    
        def OnKeyPress(self, event):
            uk = event.UnicodeKey
            key = chr(event.UnicodeKey)
            shift = event.shiftDown
            if not shift:
                key = key.lower()
            print("Key", uk, key)
            event.Skip()
    
        def onEditorCreated(self,event):
            #Set TextCtrl element to want all char/key events for all keys
            self.cb = event.Control
            if event.Control.ClassName == "wxTextCtrl":
                self.cb.SetWindowStyle(wx.WANTS_CHARS) # BEWARE! - Returns Tab, Enter, Arrow keys etc
                self.cb.Bind(wx.EVT_KEY_DOWN,self.OnKeyPress)
            else:
                print("Non text cell - bailing out")
            event.Skip()
    
    if __name__ == "__main__":
        app = wx.App()
        frame = MyForm()
        app.MainLoop()
    

    【讨论】:

    • 感谢您的努力!这是非常有用和信息丰富的
    • 嗨,我还有一个问题。使用常规文本控件对象时,您可以使用的功能之一是“GetInsertionPoint”,它会告诉您用户是否移动了插入符号等。如果网格由许多文本控件单元组成,我如何使用此插入功能每个单元格?
    • 回答自己很有趣,但我已经找到了解决方案。您可以通过事件本身到达插入点:event.EventObject.InsertionPoint。我确定某处有一个 Get 函数,但它会做。
    • @YehudaNOVO 确实! event.EventObject.GetInsertionPoint()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2015-10-16
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多