wxPython - Как установить редактор для столбца сетки - PullRequest
0 голосов
/ 23 февраля 2019

документы для wx.grid.GridCellEditor скажем

Экземпляры wx.grid.GridCellEditor ... могут быть связаны с атрибутами ячеек для отдельных ячеек, строк, столбцов или дажедля всей сетки.

Теперь я знаю, как связать редактор с ячейкой:

self.mygrid.SetCellEditor(row, 1, wx.grid.GridCellEditorSubclass())

И я знаю, как связать редактор со всей сеткой:

self.mygrid.SetDefaultEditor(wx.grid.GridCellEditorSubclass())

Но я не знаю, как установить редактор для одного столбца.Этот очевидный обходной путь не является хорошим решением:

for row in range(nrows):
    self.mygrid.SetCellEditor(row, 1, wx.grid.GridCellEditorSubclass())

, потому что, если я добавляю строки в сетку (что является обычной операцией), у новых строк не будет редактора, пока я не установлю его заново.

Другой очевидный обходной путь - связать общий класс редактора со всей сеткой и создать экземпляр редактора, специфичного для столбца, во время выполнения на основе номера столбца.

Документация явно подразумевает, что мне не нужно прибегать к какому-либо решению.Но он также не предлагает (по крайней мере, где-нибудь, где я могу найти) другой способ сделать это.

Итак, вопрос в том, как мне установить редактор для всей колонки сетки?

Ответы [ 3 ]

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

Разве эта функция не выполняется следующим?:

  • SetColFormatBool (col)
  • SetColFormatFloat (col)
  • SetColFormatNumber (col)
  • SetColFormatCustom (col, typeName)

Эти функции устанавливают как редактор, так и средство визуализации для рассматриваемого столбца.

0 голосов
/ 16 марта 2019

Подход в двух других ответах - создать тип данных, связать редактор с типом данных, а затем связать тип данных со столбцом.Отсоединение редактора от номера столбца является хорошей идеей, если у вас есть несколько столбцов с одинаковым типом данных, и поэтому эти решения, вероятно, являются лучшим универсальным подходом.

Но я хотел более простой подход, который связывает редактор с определенным столбцом, потому что в моем приложении каждый столбец имеет другой тип данных.Совместное использование типа данных через столбцы не имеет смысла.Так что этот ответ ближе к исходному вопросу.

Все это вращается вокруг смущенно названного класса wx.grid.GridCellAttr.Вы могли бы быть прощены за то, что предположили, что элемент name Attr по существу означает выравнивание и цвет, потому что это то, что он означает, например, wx.TextAttr.И наиболее четко задокументированным конструктором этого класса является GridCellAttr(colText, colBack, font, hAlign, vAlign), который снова предполагает, что Attr касается выравнивания и цвета.

Но класс wx.grid.GridCellAttr на самом деле является очень общим классом дескриптора свойств ячеек с более чем 30методы для установки и получения выравнивания и цвета, как ожидается, но также (среди прочего) размер, режим чтения / записи, рендерер и редактор .

Таким образом, способ установить редактордля столбца сетки это

my_col_property_settings = wx.grid.GridCellAttr()
my_col_property_settings.SetEditor(MyColumnSpecificEditor())
my_col_property_settings.SetAlignment(hAlign=wx.ALIGN_CENTRE, vAlign=wx.ALIGN_CENTRE)
# ... etc ...
self.mygrid.SetColAttr(1, my_col_property_settings)

Но если вы хотите установить один и тот же редактор для двух столбцов, не вызывайте SetColAttr() с тем же экземпляром GridCellAttr, потому что вы получите счетчик ссылокошибки при закрытии программы, если вы делаете.Вместо этого сделайте

self.mygrid.SetColAttr(1, my_col_property_settings.Clone())
self.mygrid.SetColAttr(2, my_col_property_settings.Clone())
0 голосов
/ 24 февраля 2019

Наиболее очевидное решение для этого, имя метода, похожее на SetDefaultEditorForColumn, похоже, не существует.

Но я думаю, что идея с Grid состоит в том, чтобы указать редактор для типа данных, а недля одного столбца.Таким образом, вы можете иметь более одного столбца с одним и тем же типом данных в вашей сетке и использовать один и тот же редактор.

Вот где Grid.RegisterDataType(self, typeName, renderer, editor) делает свою запись.

Если вы хотите изменить толькотолько один из двух, рендер или редактор, вы также можете позвонить Grid.GetDefaultRendererForType() и Grid.GetDefaultEditorForType().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...