ເນື້ອໃນ

# ການນຳເຂົ້າໂມດູນ Python

ສະຄຣິບ Python ໃນ LibreOffice ມີສາມຮູບແບບຄື: ສ່ວນຕົວ, ແບບແບ່ງປັນ ຫຼື ແບບຝັງຢູ່ໃນເອກະສານ. ພວກມັນຖືກເກັບໄວ້ໃນບ່ອນຕ່າງໆ ຕາມທີ່ອະທິບາຍໃນ ການຈັດລະບຽບ ແລະ ຕຳແໜ່ງຂອງສະຄຣິບ Python. ເພື່ອນຳເຂົ້າໂມດູນ Python, ລະບົບ Python ຕ້ອງຮູ້ຕຳແໜ່ງຂອງພວກມັນໃນລະຫວ່າງການຣັນ.

ກົນໄກນີ້ສະແດງໃຫ້ເຫັນທັງໂມດູນທີ່ຢູ່ໃນລະບົບໄຟລ໌ ແລະ ໂມດູນໃນເອກະສານ. ການຈັດການຂໍ້ຜິດພາດແມ່ນໄດ້ຂ້າມໄປເພື່ອຄວາມຊັດເຈນ. ຄຳວ່າ ໄລບຣາຣີ ຫຼື ໄດເຣັກທໍຣີ, ສະຄຣິບ ຫຼື ໂມດູນ ແມ່ນຖືກໃຊ້ແທນກັນໄດ້. ແມັກໂຄຣ Python ໝາຍເຖິງຟັງຊັນທີ່ຢູ່ພາຍໃນໂມດູນ.

ໝາຍເຫດ: ໄດເຣັກທໍຣີ <User Profile>/Scripts/python/pythonpath ຈະຖືກກວດສອບສະເໝີເມື່ອຣັນແມັກໂຄຣ Python ຈາກ <User Profile>/Scripts/python.

## ການນຳເຂົ້າໂມດູນຈາກລະບົບໄຟລ໌

ໄລບຣາຣີຂອງ LibreOffice Basic ປະກອບມີຄລາສ, ຣູທິນ ແລະ ຕົວປ່ຽນ, ສ່ວນໂມດູນ Python ປະກອບມີຄລາສ, ຟັງຊັນ ແລະ ຕົວປ່ຽນ. ສ່ວນປະກອບ Python ທີ່ໃຊ້ຄືນໄດ້ຄວນເກັບໄວ້ໃນ ແມັກໂຄຣຂອງຂ້ອຍ ພາຍໃຕ້ pythonpath. ໃຫ້ນຳເຂົ້າ uno.py ພາຍໃນໂມດູນທີ່ໃຊ້ຮ່ວມກັນ.

### ໂມດູນຂອງຜູ້ໃຊ້ ຫຼື ແບບແບ່ງປັນ

ສະຄຣິບ Python ສ່ວນຕົວ ແລະ ແບບແບ່ງປັນສາມາດນຳເຂົ້າມາໄດ້ ເມື່ອໄດເຣັກທໍຣີຂອງພວກມັນຖືກລວມຢູ່ໃນເສັ້ນທາງການຣັນຂອງ Python. ເບິ່ງໜ້າ ການດຶງຂໍ້ມູນເຊດຊັນ ສຳລັບລາຍລະອຽດເພີ່ມເຕີມ.

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

            user_lib = Session().UserPythonScripts  # ຕຳແໜ່ງສະຄຣິບຂອງຜູ້ໃຊ້
            if not user_lib in sys.path:
                sys.path.insert(0, user_lib)  # ເພີ່ມໃສ່ເສັ້ນທາງການຄົ້ນຫາ
            import screen_io as ui  # ໂມດູນ 'screen_io.py' ຢູ່ໃນໄດເຣັກທໍຣີ user_lib
            # ໃສ່ລະຫັດຂອງທ່ານຕໍ່ບ່ອນນີ້

ຕົວຢ່າງ Python ນີ້ຈະສົ່ງຕົວປ່ຽນ XSCRIPTCONTEXT ໃຫ້ກັບໂມດູນທີ່ນຳເຂົ້າມາ:

            # -*- coding: utf-8 -*-
            from __future__ import unicode_literals
            import uno, sys

            share_lib = Session.SharedPythonScripts()  # ຕຳແໜ່ງສະຄຣິບແບບແບ່ງປັນ
            if not share_lib in sys.path:
                sys.path.insert(0, share_lib)  # ເພີ່ມໃສ່ເສັ້ນທາງການຄົ້ນຫາ
            from IDE_utils import ScriptContext  # 'IDE_utils.py' ຢູ່ຮ່ວມກັບສະຄຣິບ Python ແບບແບ່ງປັນ.
            XSCRIPTCONTEXT = ScriptContext(uno.getComponentContext)
            # ໃສ່ລະຫັດຂອງທ່ານຕໍ່ບ່ອນນີ້

### ໂມດູນການຕິດຕັ້ງສຳລັບແອັບພລິເຄຊັນ

ບໍ່ຄືກັບສະຄຣິບສ່ວນຕົວ ແລະ ແບບແບ່ງປັນ, ສະຄຣິບການຕິດຕັ້ງຂອງ LibreOffice ສາມາດນຳເຂົ້າມາໄດ້ທຸກເວລາ. ນອກຈາກໂມດູນ uno ແລະ unohelper ແລ້ວ, ສະຄຣິບອື່ນໆໃນໄດເຣັກທໍຣີ <installation_path>/program ກໍສາມາດນຳເຂົ້າມາໂດຍກົງໄດ້ ເຊັ່ນ ໂມດູນ msgbox.

ດ້ວຍ Python shell:

>>> import msgbox, uno

>>> myBox = msgbox.MsgBox(uno.getComponentContext())

>>> myBox.addButton("okay")

>>> myBox.renderFromButtonSize()

>>> myBox.numberOflines = 2

>>> print(myBox.show("A small message",0,"Dialog title"))

## ການນຳເຂົ້າໂມດູນໃນເອກະສານ

ການນຳເຂົ້າໂມດູນ Python ທີ່ຝັງໃນເອກະສານແມ່ນສະແດງໄວ້ຂ້າງລຸ່ມນີ້. ການຈັດການຂໍ້ຜິດພາດແມ່ນບໍ່ໄດ້ລະບຸລະອຽດ. ເສັ້ນທາງການຣັນຂອງ Python ຈະຖືກອັບເດດເມື່ອເປີດເອກະສານ ແລະ ກ່ອນປິດເອກະສານ. ເບິ່ງ ແມັກໂຄຣທີ່ຂັບເຄື່ອນດ້ວຍເຫດການ ເພື່ອຮຽນຮູ້ວິທີເຊື່ອມໂຍງແມັກໂຄຣ Python ກັບເຫດການຂອງເອກະສານ.

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

            import sys, uno, zipimport

            def OnDocPostOpenLoadPython(event = None):
                """ ກຽມການນຳເຂົ້າໂມດູນ Python ເມື່ອໂຫຼດເອກະສານ """
                PythonLibraries.loadLibrary('lib/subdir')  # ເພີ່ມໄດເຣັກທໍຣີໃສ່ເສັ້ນທາງການຄົ້ນຫາ
                PythonLibraries.loadLibrary('my_gui', 'screen_io')  # ເພີ່ມໄດເຣັກທໍຣີ ແລະ ນຳເຂົ້າ screen_io

            def OnDocQueryCloseUnloadPython(event = None):
                """ ລ້າງ PYTHON_PATH ເມື່ອປິດເອກະສານ """
                PythonLibraries.unloadLibrary('my_gui')  # ລ້າງເສັ້ນທາງການຣັນຂອງ Python
                # ໝາຍເຫດ: ໂມດູນທີ່ນຳເຂົ້າມາຈະຍັງຄົງຖືກໂຫຼດຢູ່ໃນຕົວຢ່າງນີ້.

            class PythonLibraries():
                """ ຕົວໂຫຼດໄລບຣາຣີ ແລະ ຕົວນຳເຂົ້າໂມດູນ Python

                ປັບປຸງມາຈາກ 'Bibliothèque de fonctions' ໂດຍ Hubert Lambert
                ທີ່ https://forum.openoffice.org/fr/forum/viewtopic.php?p=286213 """
                def isImportedModule(module_name: str) -> bool:
                    """ ກວດສອບລາຍການໂມດູນໃນຂະນະຣັນ """
                    return (module_name in sys.modules.keys())
                def isLoadedLibrary(lib_name: str) -> bool:
                    """ ກວດສອບເນື້ອຫາໃນ PYTHON_PATH """
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    return (url in sys.path)
                def loadLibrary(lib_name: str, module_name=None):
                    """ ເພີ່ມໄດເຣັກທໍຣີໃສ່ PYTHON_PATH, ນຳເຂົ້າໂມດູນທີ່ລະບຸຊື່ """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    if not url in sys.path:
                        sys.path.insert(0, url)
                    if module_name and not module_name in sys.modules.keys():
                        return zipimport.zipimporter(url).load_module(module_name)
                def unloadLibrary(lib_name: str):
                    """ ລົບໄດເຣັກທໍຣີອອກຈາກ PYTHON_PATH """
                    doc = XSCRIPTCONTEXT.getDocument()
                    url = uno.fileUrlToSystemPath(
                        f'{doc.URL}/Scripts/python/{lib_name}' )
                    sys.path.remove(url)

            g_exportedScripts = (OnDocPostOpenLoadPython, OnDocQueryCloseUnloadPython)

ຫົວຂໍ້ທີ່ກ່ຽວຂ້ອງ

ການດຶງຂໍ້ມູນເຊດຊັນ

ການຂຽນໂປຣແກຣມດ້ວຍສະຄຣິບ Python

ການຈັດລະບຽບ ແລະ ຕຳແໜ່ງຂອງສະຄຣິບ Python

ເບິ່ງ ການສ້າງ Python Listener ສຳລັບຕົວຢ່າງແມັກໂຄຣທີ່ຂັບເຄື່ອນດ້ວຍເຫດການ.

ກະລຸນາສະໜັບສະໜູນພວກເຮົາ!