Ustvarjanje poslušalcev dogodkov v Pythonu

Vsebina
Kazalo 🔎︎

# Ustvarjanje poslušalcev dogodkov

Dogodki, ki jih prožijo pogovorna okna, dokumenti, obrazci ali grafični kontrolniki, so lahko povezani z makri, kar imenujemo programiranje na podlagi dogodkov. Najpogostejša načina za povezovanje dogodkov z makri sta prek zavihka Dogodki v meniju Orodja – Prilagodi in prek podokna Lastnosti kontrolnika v Urejevalniku pogovornih oken v meniju Orodja – Makri – Organiziraj pogovorna okna.

Grafični artefakti, vnosi prek tipkovnice, poteze miške in druge interakcije med človekom in strojem je mogoče nadzorovati z uporabo poslušalcev UNO, ki sledijo vedenju uporabnika. Poslušalci so alternativa dinamični programski kodi za dodelitev makrom. Eden lahko ustvari toliko poslušalcev UNO, kot je dogodkov, ki jih želi spremljati. En poslušalec lahko obravnava tudi več kontrolnikov uporabniškega vmesnika.

## Ustvarjanje poslušalca dogodkov

Poslušalci so priloženi kontrolnikom v pogovornih oknih, kot tudi dogodkom dokumentov ali obrazcev. Poslušalci se uporabljajo tudi pri ustvarjanju izvajalnih pogovornih oken ali pri sprotnem dodajanju kontrolnikov v pogovorno okno.

Ta primer ustvari poslušalca za kontrolnik Gumb1 pogovornega okna PogovornoOkno1 iz knjižnice Standardno.

### S Pythonom

             # -*- 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 je prisluhnil ...'
             _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("Uporabnik je potrdil pogovorno okno.")
                 elif rc == CANCEL:
                     MsgBox("Uporabnik je preklical pogovorno okno.")
                 ui.dispose()  # ui.endExecute
                 ctl.removeActionListener(act)

             def createUnoDialog(libr_dlg: str, embedded=False):
                 """ Ustvari pogovorno okno iz njegovega mesta """
                 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):
                 """ Poslušanje in štetje klikov gumbov """
                 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):  # obvezna rutina
                     pass

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

             g_exportedScripts = (Main,)

msgBox.py in mapa {namestitev}/program/ vsebujeta nekaj primerov poslušalcev gumbov.

### Z LibreOffice Basicom

             Option Explicit

             Const MY_LIBRARY = "Standard", MY_DIALOG = "Dialog1", MY_BUTTON = "Button1"
             Const MY_LABEL = "Basic je prisluhnil ...«
             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 "Uporabnik je potrdil pogovorno okno.",, "Basic"
                     Case rc.CANCEL : MsgBox "Uporabnik je preklical pogovorno okno.",, "Basic"
                 End Select
                 ui.dispose ' ui.endExecute()
                 ctl.removeActionListener(act)
             End Sub

             Private Sub awt_actionPerformed(evt As com.sun.star.awt.ActionEvent)
                 ''' Poslušanje in štetje klikov gumbov '''
                 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
                 ' vaša koda sodi sem
             End Sub ' awt_disposing

## Drugi poslušalci dogodkov

Poslušalci so običajno kodirani skupaj z odpiranjem pogovornega okna. Možni so številni pristopi glede poslušalca, kot so obravnalniki dogodkov za pogovorna okna ali spremljevalci dogodkov za dokumente in obrazce.

Podobne teme

Primeri programiranja za kontrolnike v urejevalniku pogovornih oken

Funkcija CreateUnoService

D'oh! You found a bug (text/swriter/01/05060700.xhp# not found).

Preslikovanje dogodkov v predmete

Glejte tudi Dogodki dokumenta in Dogodki obrazca.

Ustvarjanje krmilnikov pogovornih oken

Poslušanje dogodkov dokumenta

Primeri programov v Pythonu