Обекти слушатели на Python : Създаване на слушатели за събития

Съдържание
Индекс 🔎︎

# Създаване на слушатели за събития

Събитията, изпращани от диалози, документи, формуляри или графични контроли, могат да бъдат свързвани с макроси – това се нарича програмиране, базирано на събития. Най-разпространеният метод за обвързване на събитие с макрос са разделът Събития в менюто Инструменти - Персонализиране и панелът „Свойства на контрола“ в редактора на диалогови прозорци от менюто Инструменти - Макроси - Управление на диалогови прозорци....

Графичните елементи, входът от клавиатурата, движенията на мишката и други взаимодействия човек – машина могат да се управляват чрез слушатели на UNO, които наблюдават действията на потребителя. Слушателите представляват алтернатива с динамичен програмен код на присвояването на макроси. Можете да създадете толкова слушатели на UNO, колкото събития са достъпни за наблюдение. Един слушател може да обработва няколко контроли от потребителския интерфейс.

## Създаване на слушател на събития

Слушателите се прикрепват към контролите в диалогови прозорци, както и към събития от документи или формуляри. Слушатели се използват и при създаване на диалози или добавяне на контроли към диалогов прозорец по време на изпълнение.

Този пример създава слушател за контролата Button1 в диалога Dialog1 от библиотеката Standard.

### С Python

             # -*- coding: utf-8 -*-
             from __future__ import unicode_literals

             import uno, unohelper
             from com.sun.star.awt import XActionListener
             from com.sun.star.awt import ActionEvent
             from com.sun.star.lang import EventObject
             from com.sun.star.ui.dialogs.ExecutableDialogResults \
                 import OK, CANCEL
             import msgbox as util

             _MY_BUTTON =  "Button1"
             _MY_LABEL = 'Python слуша...'
             _DLG_PROVIDER = "com.sun.star.awt.DialogProvider"

             def Main(*args):
                 ui = createUnoDialog("Standard.Dialog1", embedded=True)
                 ui.Title = "Python X[any]Listener"
                 ctl = ui.getControl(_MY_BUTTON)
                 ctl.Model.Label = _MY_LABEL
                 act = ActionListener()
                 ctl.addActionListener(act)
                 rc = ui.execute()
                 if rc == OK:
                     MsgBox("Потребителят потвърди диалога.")
                 elif rc == CANCEL:
                     MsgBox("Потребителят отказа диалога.")
                 ui.dispose()  # ui.endExecute
                 ctl.removeActionListener(act)

             def createUnoDialog(libr_dlg: str, embedded=False):
                 """ Създаване на диалог от местоположението му """
                 smgr = XSCRIPTCONTEXT.getComponentContext().ServiceManager
                 if embedded:
                     model = XSCRIPTCONTEXT.getDocument()
                     dp = smgr.createInstanceWithArguments(_DLG_PROVIDER, (model,))
                     location = "?location=document"
                 else:
                     dp = smgr.createInstanceWithContext(_DLG_PROVIDER, ctx)
                     location = "?location=application"
                 dlg = dp.createDialog("vnd.sun.star.script:"+libr_dlg+location)
                 return dlg

             class ActionListener(unohelper.Base, XActionListener):
                 """ Наблюдаване и броене щракванията на бутони """
                 def __init__(self):
                     self.count = 0

                 def actionPerformed(self, evt: ActionEvent):
                     self.count = self.count + 1
                     #mri(evt)
                     if evt.Source.Model.Name == _MY_BUTTON:
                         evt.Source.Model.Label = _MY_LABEL+ str( self.count )
                 return

                 def disposing(self, evt: EventObject):  # задължителна подпрограма
                     pass

             def MsgBox(txt: str):
                 mb = util.MsgBox(uno.getComponentContext())
                 mb.addButton("Ok")
                 mb.show(txt, 0, "Python")

             g_exportedScripts = (Main,)

msgbox.py в директорията {инсталация}/program/ съдържа примери за слушатели на бутони.

### С LibreOffice Basic

             Option Explicit

             Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
             Const MY_LABEL = "Basic слуша..."
             Dim count As Integer

             Sub Main
                 Dim libr As Object ' com.sun.star.script.XLibraryContainer
                 Dim dlg As Object
                 Dim ui As Object  ' stardiv.Toolkit.UnoDialogControl
                 Dim ctl As Object ' stardiv.Toolkit.UnoButtonControl
                 Dim act As Object ' com.sun.star.awt.XActionListener
                 Dim rc As Object : rc = com.sun.star.ui.dialogs.ExecutableDialogResults

                 BasicLibraries.LoadLibrary(MY_LIBRARY)
                 libr = DialogLibraries.GetByName(MY_LIBRARY)
                 dlg = libr.GetByName(MY_DIALOG)
                 ui = CreateUnoDialog(dlg)
                 ui.Title = "Basic X[any]Listener example"
                 count = 0
                 ctl = ui.GetControl(MY_BUTTON)
                 ctl.Model.Label = MY_LABEL
                 act = CreateUnoListener("awt_", "com.sun.star.awt.XActionListener")
                 ctl.addActionListener(act)
                 Select Case ui.Execute
                     Case rc.OK : MsgBox "Потребителят потвърди диалога.",, "Basic"
                     Case rc.CANCEL : MsgBox "Потребителят отказа диалога.",, "Basic"
                 End Select
                 ui.dispose ' ui.endExecute()
                 ctl.removeActionListener(act)
             End Sub

             Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
                 ''' Наблюдаване и броене щракванията на бутони '''
                 With evt.Source.Model
                     If .Name = MY_BUTTON Then
                         count = count + 1
                         .Label = MY_LABEL+Cstr(count)
                     End If
                 End With
             End Sub ' awt_actionPerformed

             Private Sub awt_disposing(evt As com.sun.star.lang.EventObject) ' mandatory Sub
                 ' място за вашия код
             End Sub ' awt_disposing

## Други слушатели на събития

Слушателите обикновено се програмират заедно с отварянето на диалога. Възможни са множество подходи, например обработчици на събития за диалози или наблюдатели на събития за документи или формуляри.

Теми, свързани с показаната

Примери за програмиране на контроли в редактора на диалогови прозорци

Функция CreateUnoListener

Съпоставяне на събития и обекти

Вижте също Събития в документи,Събития във формуляри.

Създаване на обработчик на диалог

Наблюдение на събития в документите

Примери за програмиране на Python