Ошибка в макросе Python

Автор karpo518, 3 мая 2017, 10:26

0 Пользователи и 1 гость просматривают эту тему.

karpo518

Добрый день. Подскажите, пожалуйста, в чём причина ошибки в коде


def IsAnythingSelected(oDoc):
if(oDoc is None):
return False
oSels = oDoc.getCurrentSelection()
if(oSels is None) or (oSels.getCount() == 0):
return False

if (oSels.getCount() > 1):
return True
else:
oSel = oSels.getByIndex(0)
#msgBox(oSel.getText().String)
oCursor = oSel.getText().CreateTextCursorByRange(oSel)
if not oCursor.IsCollapsed():
return True
return False


Ошибка:

com.sun.star.uno.RuntimeExceptionError during invoking function TestFunc in module file:///usr/lib/libreoffice/share/Scripts/python/TestFunc.py (<class 'AttributeError'>: CreateTextCursorByRange
  /usr/lib/libreoffice/share/Scripts/python/TestFunc.py:58 in function IsAnythingSelected() [oCursor = oSel.getText().CreateTextCursorByRange(oSel)]
  /usr/lib/libreoffice/share/Scripts/python/TestFunc.py:29 in function TestFunc() [if IsAnythingSelected(model):]
  /usr/lib/libreoffice/program/pythonscript.py:870 in function invoke() [ret = self.func( *args )]
)
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от  3 мая 2017, 08:26Добрый день. Подскажите, пожалуйста, в чём причина ошибки в коде
Много причин:
1. первая:
if(oSels is None) or (oSels.getCount() == 0):
getCount() может быть только при выборе не смежных диапазонов, у простого выделения одной ячейки или одного сплошного диапазона такого метода нет вообще.

2. вторая:
oCursor = oSel.getText().CreateTextCursorByRange(oSel)
метод getText() есть только у единичной ячейки, а метод CreateTextCursorByRange() есть у целого листа, но не у ячейки или диапазона ячеек — как это совместить ???

karpo518

Спасибо за ответ. Вы используете термины электронных таблиц. Я работаю с текстовым документом.

В этом документе oSels.getCount()  существует и возвращает 1, даже если ничего не выделено.  С этим кодом нет проблем. Офис ругается на строку

oCursor = oSel.getText().CreateTextCursorByRange(oSel)

Цитировать
метод getText() есть только у единичной ячейки, а метод CreateTextCursorByRange() есть у целого листа, но не у ячейки или диапазона ячеек — как это совместить

Код взят из рабочего макроса на бэйсике,  кроме того, в примере Capitalize.py(https://wiki.openoffice.org/wiki/PyUNO_samples) всё работает ровно также.

В моём случае код
if oSel.supportsService("com.sun.star.text.XTextRange") :
msgBox("Поддержка текстовых интервалов")

Не выполняется. Это странно, потому что oSel.ImplementationName = 'SwXTextRange' и атрибут должен поддерживаться
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от  3 мая 2017, 13:58
Я работаю с текстовым документом.
Такие вещи нужно сразу сообщать.


Цитата: karpo518 от  3 мая 2017, 13:58
Офис ругается на строку

oCursor = oSel.getText().CreateTextCursorByRange(oSel)

Должно быть: oCursor = oSel.getText().createTextCursorByRange(oSel) (create с маленькой буквы, код в Python регистрозависимый)

На что ещё ругается после проверки регистров?

karpo518

Спасибо! После исправления регистра в 2-х строках код заработал. Даже и не подумал, что  CreateTextCursorByRange и есть сам атрибут, на который ругался офис
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

economist

Языки Python, LUA требуют ввода команд маленьким буквами. Это проще, чем давить Shift.

Язык VBA любит и поощряет ввод команд маленьким буквами, поскольку сразу же капитализирует верно набранную команду. activesheet -> ActiveSheet. Это и удобно, и помогает сберечь время. Ошибки видно сразу, за полметра.

И только язык StarBasic из OpenOffice|LibreOffice плюёт на все стандарты и разумные фишки. В нем как ни набирай, все равно ни ошибки, ни внешний вид - наглядно не показываются.  А зря...
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...