Обнаружение ключевых событий в сетке - wxPython - PullRequest
0 голосов
/ 25 февраля 2019

Я создал сетку, используя wxPython, и мне нужно отслеживать данные, вставленные пользователем в одну из ячеек в моей сетке.Мне нужно иметь событие из-за каждого нажатия клавиши на клавиатуре (например, EVT_KEY_DOWN), и я не могу найти способ сделать это.Прямо сейчас мне нужно использовать сетку для этой цели, поэтому решение должно быть чем-то, что может быть интегрировано в wx.grid.

Я пытался использовать GridCellEditor, но он дает только первый ключ.Есть ли способ интегрировать TextCtrl в ячейку сетки или что-то в этом роде?

1 Ответ

0 голосов
/ 26 февраля 2019

Насколько я могу судить, если не указано иное, сетка - это коллекция 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()

enter image description here

...