首页 > 解决方案 > 网格中的关键事件检测 - wxPython

问题描述

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

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

标签: python-3.xeventstextwxpythonwxgrid

解决方案


据我所知,除非另有说明,否则网格是 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()

在此处输入图像描述


推荐阅读