устранить перетаскивание выберите в wx.Grid - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь выяснить, как устранить поведение перетаскивания, которое по умолчанию используется в wx.Grid. Я хотел бы закончить с сеткой, для которой пользователь не может перетащить вообще.

Я (в конце концов) нашел MouseEventsManager, который выглядел идеально, но не выполняет то, что я ожидаю:

import wx
import wx.grid as gridlib

class GridMouseEventsManager(wx.MouseEventsManager):
    def MouseDragBegin(self, item, pos):
        return False

class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Sample grid")

        self.grid = gridlib.Grid(self)
        self.grid.CreateGrid(5,4)
        self.grid.SetCellSize(4,1,1,2)

        self.grid.SetColLabelSize(0)            # eliminates spreadsheet-style row & col headers
        self.grid.SetRowLabelSize(0)

        rowHeight = 50
        colWidth  = 50
        for i in range(1,5):
            self.grid.SetRowSize(i, rowHeight)
        for i in range(0,4):
            self.grid.SetColSize(i, colWidth)

        self.grid.SetCellBackgroundColour(4, 3, wx.LIGHT_GREY)

        # self.grid.SetCellHighlightPenWidth(0)   # eliminates highlighted cell, i.e., 'current' cell in spreadsheet
        self.grid.EnableCellEditControl(False)
        self.grid.Bind(gridlib.EVT_GRID_SELECT_CELL, self.GridSelect, self.grid)

        self.grid_mouse_events_manager = GridMouseEventsManager(self.grid)

        self.Bind(wx.EVT_CLOSE, self.on_exit)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(self.grid, 0, wx.ALIGN_CENTER)

        self.selectedRow = -1
        self.selectedCol = -1

        self.SetSizerAndFit(mainSizer)
        # self.ShowFullScreen(True)

    def GridSelect(self, event):

        col = event.GetCol()
        row = event.GetRow()

        penWidth = 0
        if col == 1:
            penWidth = 2

        self.grid.SetCellHighlightPenWidth(penWidth)

        self.Refresh()

    def on_exit(self, event):
        self.grid_mouse_events_manager.Destroy()
        self.Destroy()

# Run the program
if __name__ == "__main__":
    app = wx.App()
    frame = MyForm().Show()
    app.MainLoop()

Это по-прежнему поведение по умолчанию, которое заключается в выборе нескольких ячеек, когда пользователь щелкает и перетаскивает. Я хотел бы полностью отключить перетаскивание и / или выбор нескольких ячеек.

Я довольно новичок в Python и еще новее в wxPython; Я не смог найти объяснение или пример того, как это сделать. Я пробовал конструктор MouseEventsManager как с объектом self, так и с объектом grid, ни один из которых, похоже, не имеет никакого эффекта.

Как это сделать?

1 Ответ

1 голос
/ 21 марта 2020

Ну, разве вы не знаете, что еще один поиск по wx python .org дал то, что я хотел

self.grid.GetGridWindow().Bind(wx.EVT_MOTION, self.OnMotion)

...

def OnMotion(self, event)
    # just trap this event and prevent it from percolating up the window hierarchy
    pass

Это сделало то, что я хочу.

...