Python UNO в LibreOffice Calc, перемещение курсора - PullRequest
0 голосов
/ 27 мая 2018

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()

1 Ответ

0 голосов
/ 27 мая 2018

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

Кажется также, что существует некоторая путаница с методами и переменными класса Python, поэтому я также изменил эти части.

import uno
import unohelper

SCOOBY = "Scooby"

class ODSCursor(unohelper.Base):
    def __init__(self):
        self.ctx = None
        self.desktop = None
        self.document = None
        self.controller = None
        self.sheet = None
        self.counter = 0

    def sheet1(self):
        """Initialize uno handle only once and get the first sheet."""
        if self.sheet is not None:
            return self.sheet
        self.ctx = uno.getComponentContext()
        self.desktop = self.ctx.ServiceManager.createInstanceWithContext(
            "com.sun.star.frame.Desktop", self.ctx)
        self.document = self.desktop.getCurrentComponent()
        self.controller = self.document.getCurrentController()
        self.sheet = self.controller.getActiveSheet()
        return self.sheet

    def writeonce(self):
        self.writeval("B1", self.inc())

    def writetwice(self):
        self.writeval("B2", self.inc())

    def writescooby(self):
        self.writeval("C4", SCOOBY)

    def writeval(self, address, value):
        self.deselect()
        cell = self.sheet.getCellRangeByName(address)
        cell.String = value
        self.controller.select(cell)

    def deselect(self):
        """Select cell A1, then select nothing."""
        cell_a1 = self.sheet.getCellByPosition(0, 0)
        self.controller.select(cell_a1)
        emptyRanges = self.document.createInstance(
            "com.sun.star.sheet.SheetCellRanges")
        self.controller.select(emptyRanges)

    def inc(self):
        """Increment the counter and return the value."""
        self.counter += 1
        return self.counter

odsc = ODSCursor()


### BUTTON BOUND FUNCTIONS ###

def dowriteonce(dummy_oEvent):
    odsc.sheet1()
    odsc.writeonce()

def dowritetwice(dummy_oEvent):
    odsc.sheet1()
    odsc.writetwice()

def dowritethrice(dummy_oEvent):
    odsc.sheet1()
    odsc.writescooby()
...