Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

24 Август 2017, 02:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Ошибка в макросе Python  (Прочитано 528 раз)
0 Пользователей и 1 Гость смотрят эту тему.
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Стартовое сообщение: 3 Май 2017, 10:26 »

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

Код:
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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 149


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 3 Май 2017, 13:06 »

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

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

karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #2: 3 Май 2017, 13:58 »

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

В этом документе 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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 149


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 3 Май 2017, 14:21 »

Я работаю с текстовым документом.
Такие вещи нужно сразу сообщать.


Офис ругается на строку

Код:
oCursor = oSel.getText().CreateTextCursorByRange(oSel)

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

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

karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #4: 3 Май 2017, 14:44 »

Спасибо! После исправления регистра в 2-х строках код заработал. Даже и не подумал, что  CreateTextCursorByRange и есть сам атрибут, на который ругался офис
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
economist
Ветеран
*****
Offline Offline

Сообщений: 652


« Ответ #5: 3 Май 2017, 15:08 »

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

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!