python-3.x - 网格中的关键事件检测 - wxPython
问题描述
我使用 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()
推荐阅读
- reactjs - 将 Button 组件传递给 Bootstrap Tab 组件的 Title 属性
- python - 熊猫重命名列名
- jaxb - 由于 580 次 IllegalAnnotationExceptions 创建 JAXB Marshaller 时出现 jbpm 错误
- firebase - 将公共之外的根文件夹添加到托管 Firebase
- powerbi - 如何使用 DAX 中的键过滤的时间输入和超时来制作连贯的 IF 语句
- for-loop - 在 systemverilog 中实现 for 循环
- sql - SQL Total Distinct Count on Group By Query
- c - 我正在尝试对字符 z(ASCII 122)执行凯撒移位。如何给它“更多空间”以防止它溢出超过 127?
- django - Django-cms,模板中的子变量,页面导航在较新版本中不显示
- c# - Create Extension Method of ICollection
after .Count()