Вывести данные в форме таблицы в пользовательском интерфейсе Blender можно при помощи функций row() и column() элемента layout в классе Panel, от которого мы наследуем классы панелей пользовательского UI.
Автор решения: Dion Moult
Для примера определим класс пользовательской панели во вкладке Modifier в рабочей области Properties:
1 2 3 4 5 6 7 8 9 |
class TEST_PT_panel(bpy.types.Panel): bl_label = 'Text' bl_idname = 'TEST_PT_panel' bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = 'modifier' def draw(self, context): layout = self.layout |
Зарегистрируем его в API Blender:
1 |
bpy.utils.register_class(TEST_PT_panel) |
В функции draw() создадим таблицу размером 4 на 4 с простыми текстовыми полями:
1 2 3 4 5 6 |
box = layout.box() row = box.row() cols = [row.column() for i in range(4)] for i in range(4): for j in range(4): cols[i].label(text='Sample Text') |
Выполнив код мы добавим новую панель во вкладку модификаторов объекта.
Как мы видим, текст в таблице выравнивается не по центру ячеек, а по левому краю.
Для выравнивания элементов обычно используется параметр alignment. Однако если мы установим этот параметр для колонок:
1 |
cols[i].alignment = 'CENTER' |
ничего не изменится.
Для того чтобы выровнять текст по центру ячеек, можно в каждой ячейке создать еще одну внутреннюю строку и назначить выравнивание уже внутри нее.
1 2 3 4 5 6 7 8 9 |
box = layout.box() row = box.row() cols = [row.column() for i in range(4)] for i in range(4): for j in range(4): r = cols[i].row() r.alignment = 'CENTER' r.label(text='Align Center') r = cols[i].row() |
В этом случае параметр alignment работает так как нам нужно.
И мы получили выравнивание текста в ячейках по центру:
Полный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class TEST_PT_panel(bpy.types.Panel): bl_label = 'Text Centered' bl_idname = 'TEST_PT_panel' bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = 'modifier' def draw(self, context): layout = self.layout box = layout.box() row = box.row() cols = [row.column() for i in range(4)] for i in range(4): for j in range(4): r = cols[i].row() r.alignment = 'CENTER' r.label(text='Sample Text') r = cols[i].row() |