LibreOffice 5.3, python 3.53, VOID Linux
Это скорее вопрос uno, чем вопрос о python.Код ниже делает простое обновление из 3 ячеек.На листе сконфигурированы 3 кнопки, вызывающие dowriteonce (), dowritetwice () и dowritethrice (), и все они обновляются и работают так, как можно ожидать записи чисел и текста в выбранные ячейки.
При возникновении проблемы, когда пользователь редактирует ячейку в пользовательском интерфейсе, любое последующее обновление этой ячейки посредством выполнения функции блокируется.Поэтому простой щелчок по ячейке C4 в пользовательском интерфейсе calc не позволяет функции writethrice () обновить ячейку C4.Если я удаляю содержимое и щелкаю другую ячейку в пользовательском интерфейсе, скажем, C5, то все снова работает нормально и C4 обновляется при нажатии кнопки.
Что я хотел бы сделать, это переместить курсор редактирования пользовательского интерфейса в неиспользуемую ячейку перед выполнением, чтобы предотвратить это.Пользователь copy-paste собирается оставить активный курсор в непредсказуемых местах, и это будет мешать вычислениям, если я не могу изолировать курсор.
Итак, вопрос в том, как переместить курсор редактирования пользовательского интерфейса в именованную ячейку через API UNO с помощью Python?Или, если это проще, просто временно отключите его.
Python:
import socket
import sys
import re
import uno
import unohelper
class ODSCursor(unohelper.Base):
# predeclare class properties
ctx=None
desktop=None
model=None
activesheet=None
counter=0
scooby="Scooby"
# import namespaces
def __init__(self):
import socket
import uno
import unohelper
import sys
import re
# initialize uno handle only once and get the first sheet
@classmethod
def sheet1(cls,*args):
if cls.activesheet is not None:
return (cls.activesheet)
cls.ctx = uno.getComponentContext()
cls.desktop = cls.ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", cls.ctx)
cls.model = cls.desktop.getCurrentComponent()
# cls.activesheet = cls.model.Sheets.getByName("Sheet1")
cls.activesheet = cls.model.Sheets.getByIndex(0)
return (cls.activesheet)
@classmethod
def writeonce(self,*args):
self.counter += 1
cell_b1 = self.activesheet.getCellRangeByName("B1")
cell_b1.String = self.counter
@classmethod
def writetwice(self,*args):
self.counter += 1
cell_b2 = self.activesheet.getCellRangeByName("B2")
cell_b2.String = self.counter
@classmethod
def writescooby(self,*args):
cell_c4 = self.activesheet.getCellRangeByName("C4")
cell_c4.String = self.scooby
### BUTTON BOUND FUNCTIONS ###
def dowriteonce(*args):
Odc = ODSCursor() # create the object
Odc.sheet1()
Odc.writeonce()
def dowritetwice(*args):
Odc = ODSCursor() # create the object
Odc.sheet1()
Odc.writetwice()
def dowritethrice(*args):
Odc = ODSCursor() # create the object
Odc.sheet1()
Odc.writescooby()