我使用 wxPython 创建了一个网格,我需要监视用户插入到我网格中的一个单元格中的数据。由于键盘上的每次按键(如EVT_KEY_DOWN),我都需要一个事件,但我找不到这样做的方法。现在我需要为此使用网格,所以解决方案必须是可以集成到 wx.grid 中的东西。
我尝试使用 GridCellEditor 但它只给出了第一个键。有没有办法将 TextCtrl 集成到网格的单元格或类似的东西中?
我使用 wxPython 创建了一个网格,我需要监视用户插入到我网格中的一个单元格中的数据。由于键盘上的每次按键(如EVT_KEY_DOWN),我都需要一个事件,但我找不到这样做的方法。现在我需要为此使用网格,所以解决方案必须是可以集成到 wx.grid 中的东西。
我尝试使用 GridCellEditor 但它只给出了第一个键。有没有办法将 TextCtrl 集成到网格的单元格或类似的东西中?
据我所知,除非另有说明,否则网格是 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()