ເນື້ອໃນ

# ການສ້າງສະຄຣິບ Python ດ້ວຍ ScriptForge

## ຄວາມແຕກຕ່າງລະຫວ່າງ Basic ແລະ Python

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

- ຊື່ເມັດທອດ ແລະ ຄຸນສົມບັດ: ໃນ Python, ທຸກໆເມັດທອດ ແລະ ຄຸນສົມບັດສາມາດໃຊ້ໄດ້ທັງໃນຮູບແບບຕົວອັກສອນນ້ອຍທັງໝົດ (lowercased), ຕົວໃຫຍ່ສະເພາະໂຕທຳອິດ (ProperCased) ຫຼື ຮູບແບບອູດ (camelCased).

- ອາກິວເມັນ: ທຸກໆອາກິວເມັນຄີເວີດ (keyword arguments) ທີ່ສົ່ງຕໍ່ໄປຍັງເມັດທອດແມ່ນເປັນຕົວອັກສອນນ້ອຍທັງໝົດ.

- ວັນທີ: ທຸກໆວັດຖຸວັນທີຈະຖືກສົ່ງຕໍ່ ແລະ ສົ່ງຄືນເປັນວັດຖຸ datetime.datetime ຂອງ Python ໂດຍກົງ.

- ອາເຣ (Arrays): ອາເຣມິຕິດຽວຈະຖືກສົ່ງຕໍ່ ແລະ ສົ່ງຄືນເປັນ tuples (ເຊິ່ງເປັນວັດຖຸທີ່ບໍ່ສາມາດປ່ຽນແປງຄ່າໄດ້). ອາເຣສອງມິຕິຈະຖືກສົ່ງຕໍ່ ແລະ ສົ່ງຄືນເປັນ tuples ຂອງ tuples.

- None: ຄີເວີດ None ຂອງ Python ແມ່ນທຽບເທົ່າກັບ Null, Empty ຫຼື Nothing ຂອງ Basic.

- ວັດຖຸ UNO: ໂຄງສ້າງ UNO ທັງໝົດຈະຖືກແລກປ່ຽນລະຫວ່າງ Basic ແລະ Python ໂດຍບໍ່ມີການປ່ຽນແປງໃດໆ.

- ການດີບັກ (Debugging): ທຸກຄັ້ງທີ່ເກີດຂໍ້ຜິດພາດໃນສະຄຣິບ Python ທີ່ໃຊ້ ScriptForge, ຂໍ້ຄວາມສະແດງຂໍ້ຜິດພາດທີ່ໃຫ້ໂດຍ Python execution stack ຈະສະແດງແຖວຂອງໂຄດທີ່ເປັນຕົວກະຕຸ້ນໃຫ້ເກີດຂໍ້ຜິດພາດ. ໃນຂໍ້ຄວາມສະແດງຂໍ້ຜິດພາດຂອງ Basic ຈະບໍ່ສະແດງຂໍ້ມູນນີ້.

ເຂົ້າເບິ່ງ ຊ່ວຍເຫຼືອສະຄຣິບ Python ຂອງ LibreOffice ສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບການຂຽນສະຄຣິບ Python ໂດຍໃຊ້ LibreOffice.

## ການແກ້ໄຂສະຄຣິບ Python ໃນ IDEs

ຄຳແນະນຳການພິມ (typing hints) ຂອງ Python - ເຊິ່ງກ່ຽວຂ້ອງກັບເມັດທອດສາທາລະນະ ແລະ ຄຸນສົມບັດຂອງບໍລິການ ScriptForge - ສາມາດເອົາໄດ້ຈາກ IDEs ທີ່ຮອງຮັບສິ່ງອຳນວຍຄວາມສະດວກດັ່ງກ່າວ. ໃນທາງກາຍະພາບ, ຂະນະທີ່ພວມແກ້ໄຂສະຄຣິບຂອງຜູ້ໃຊ້:

- ການວາງເມົາສ໌ໄວ້ເທິງອິນສະແຕນຊ໌ວັດຖຸ, ເມັດທອດ ຫຼື ຄຸນສົມບັດ ຈະສະແດງຄຳອະທິບາຍລະອຽດຂອງມັນ.

- ການພິມ "." ຫຼັງຈາກອິນສະແຕນຊ໌ວັດຖຸ ຈະສະແດງກ່ອງລາຍການແບບເລື່ອນລົງທີ່ລະບຸອິນເຕີເຟສທັງໝົດທີ່ມີຢູ່.

- ວົງເລັບຫຼັງຈາກຊື່ເມັດທອດ ຈະເລີ່ມການຕື່ມຂໍ້ມູນໂຄດໃຫ້ສົມບູນ (code-completion) ໂດຍການສະແດງອາກິວເມັນຂອງມັນ.

ຄຳແນະນຳການພິມຈະຖືກສະແດງເມື່ອມີການແກ້ໄຂເມັດທອດ ແລະ ຄຸນສົມບັດດ້ວຍຕົວອັກສອນແບບ propercase.

## ການລັນສະຄຣິບ Python ໃນ LibreOffice

ຂຶ້ນກັບສິ່ງທີ່ທ່ານຕັ້ງໃຈຈະເຮັດ, ທ່ານອາດຈະເລືອກໜຶ່ງໃນວິທີການຕໍ່ໄປນີ້ເພື່ອລັນສະຄຣິບ Python ໃນ LibreOffice:

- ລັນສະຄຣິບພາຍໃນໂປຣເຊສ (process) ຂອງ LibreOffice ປັດຈຸບັນ: ສະຄຣິບ Python ຈະຖືກປະຕິບັດງານຈາກພາຍໃນໂປຣເຊສຂອງ LibreOffice ໂດຍການໃຊ້ເມນູ Tools - Macros - Run Macro ຫຼື ສ່ວນຂະຫຍາຍ APSO ເພື່ອເອີ້ນໃຊ້ສະຄຣິບຂອງຜູ້ໃຊ້ທີ່ເກັບໄວ້ໃນໂຟນເດີສະຄຣິບ Python. ນອກຈາກນັ້ນ ທ່ານຍັງສາມາດໃຊ້ APSO Python shell ເພື່ອລັນສະຄຣິບ Python ແບບໂຕ້ຕອບໄດ້ນຳອີກ.

- Run Scripts separately from the LibreOffice process: Python scripts are executed from an external process that connects to an ongoing LibreOffice process using a socket.

ຖ້າທ່ານມີແຜນທີ່ຈະລັນສະຄຣິບຈາກພາຍໃນໂປຣເຊສຂອງ LibreOffice, ແນະນຳໃຫ້ຕິດຕັ້ງ ສ່ວນຂະຫຍາຍ APSO (Alternative Script Organizer for Python). ເຖິງຢ່າງໃດກໍຕາມ, ເພື່ອພັດທະນາສະຄຣິບ Python ຈາກພາຍນອກ LibreOffice, ທ່ານສາມາດເລືອກ Python IDE ທີ່ທ່ານຕ້ອງການໄດ້.

## ການລັນສະຄຣິບຈາກພາຍໃນໂປຣເຊສຂອງ LibreOffice

### ການໃຊ້ສ່ວນຂະຫຍາຍ APSO

ວິທີທີ່ງ່າຍທີ່ສຸດໃນການເລີ່ມຕົ້ນການຂຽນສະຄຣິບ Python ໃນ LibreOffice ແມ່ນການຕິດຕັ້ງສ່ວນຂະຫຍາຍ APSO. ຫຼັງຈາກຕິດຕັ້ງແລ້ວ, ໃຫ້ເປີດຄອມໂພເນນໃດໜຶ່ງຂອງ LibreOffice ແລະ ໄປທີ່ Tools - Macros - Organize Python Scripts.

ໃນໜ້າຕ່າງຫຼັກຂອງ APSO ໃຫ້ໄປທີ່ Menu - Python Shell.

ອີກທາງເລືອກໜຶ່ງ ທ່ານສາມາດເປີດ APSO ໂດຍໃຊ້ຄີລັດເລີ່ມຕົ້ນ Alt + Shift + F11.

ຕອນນີ້ທ່ານສາມາດເລີ່ມພິມຄຳສັ່ງ Python ແລະ shell ຈະພິມຜົນໄດ້ຮັບທີ່ກົງກັນອອກມາ ຫຼັງຈາກທີ່ແຕ່ລະແຖວຂອງໂຄດຖືກປະຕິບັດງານ.

ເພື່ອເລີ່ມຕົ້ນການໃຊ້ຫ້ອງສະໝຸດ ScriptForge, ທ່ານຈຳເປັນຕ້ອງນຳເຂົ້າເມັດທອດ CreateScriptService ເຊິ່ງທ່ານຈະສາມາດເຂົ້າເຖິງບໍລິການຕ່າງໆທີ່ໃຫ້ໂດຍຫ້ອງສະໝຸດ. ຕົວຢ່າງດ້ານລຸ່ມນີ້ໃຊ້ບໍລິການ Basic ເພື່ອສະແດງກ່ອງຂໍ້ຄວາມ (message box).

        from scriptforge import CreateScriptService
        bas = CreateScriptService("Basic")
        bas.MsgBox("Hello!")

ເພື່ອລັນຕົວຢ່າງດ້ານເທິງ, ໃຫ້ປ້ອນແຕ່ລະແຖວລົງໃນ Python shell ເທື່ອລະແຖວ, ໂດຍການກົດປຸ່ມ Enter ຫຼັງຈາກທີ່ທ່ານພິມແຕ່ລະແຖວຂອງໂຄດສຳເລັດ.

ຕອນນີ້ທ່ານສາມາດເລີ່ມປະຕິບັດຄຳສັ່ງ Python ໂດຍໃຊ້ບໍລິການໃດໜຶ່ງຂອງ ScriptForge ໄດ້ແລ້ວ. ຕົວຢ່າງເຊັ່ນ: ສ່ວນຂອງໂຄດດ້ານລຸ່ມນີ້ໃຊ້ບໍລິການ UI ເພື່ອສ້າງເອກະສານ Writer ຫວ່າງເປົ່າ.

        ui = CreateScriptService("UI")
        doc = ui.CreateDocument("Writer")

### ການສ້າງໄຟລ໌ສະຄຣິບ Python

ທ່ານສາມາດສ້າງໄຟລ໌ Python ຂອງຕົນເອງ ແລະ ແກ້ໄຂພວກມັນດ້ວຍຕົວແກ້ໄຂຂໍ້ຄວາມ (text editor) ທີ່ທ່ານຕ້ອງການ. ຫຼັງຈາກນັ້ນທ່ານສາມາດເອີ້ນໃຊ້ພວກມັນໄດ້ຈາກພາຍໃນຄອມໂພເນນໃດໜຶ່ງຂອງ LibreOffice.

ຂັ້ນຕອນທຳອິດແມ່ນການລະບຸຕຳແໜ່ງທີ່ເກັບສະຄຣິບຂອງຜູ້ໃຊ້ຂອງທ່ານ. ສຳລັບເລື່ອງນັ້ນ, ໃຫ້ອ້າງອີງເຖິງໜ້າຊ່ວຍເຫຼືອ ການຈັດລະບຽບ ແລະ ຕຳແໜ່ງຂອງສະຄຣິບ Python.

ຕອນນີ້ທ່ານສາມາດສ້າງໄຟລ໌ຂໍ້ຄວາມພາຍໃນໂຟນເດີສະຄຣິບ Python ຂອງຜູ້ໃຊ້ຂອງທ່ານ, ຕົວຢ່າງເຊັ່ນ sf_test.py, ແລະ ເລີ່ມພິມສະຄຣິບຂອງທ່ານ.

ຕໍ່ໄປນີ້ແມ່ນຕົວຢ່າງງ່າຍໆທີ່ເອົາຄ່າຕົວເລກຈາກເຊວ (cell) ຂອງ Calc ແລະ ເພີ່ມຄ່າຂຶ້ນ 1. ພຽງແຕ່ພິມໂຄດຕໍ່ໄປນີ້ລົງໃນໄຟລ໌ sf_test.py.

        from scriptforge import CreateScriptService
        doc = CreateScriptService("Calc")

        def increment_cell(args=None):
            value = doc.GetValue("A1")
            value += 1
            doc.SetValue("A1", value)

        g_exportedScripts = (increment_cell, )

ຕົວຢ່າງນີ້ສ້າງຟັງຊັນ increment_cell. ໃຫ້ສັງເກດວ່າ g_exportedScripts ແມ່ນ tuple ທີ່ບອກວ່າຟັງຊັນໃດຈະຖືກສະແດງໃນ LibreOffice ເປັນສະຄຣິບຂອງຜູ້ໃຊ້.

ເພື່ອລັນສະຄຣິບນີ້ຈາກພາຍໃນເອກະສານ Calc:

1. ສ້າງ ຫຼື ເປີດໄຟລ໌ Calc.

2. ປ້ອນຄ່າຕົວເລກບາງຢ່າງລົງໃນເຊວ "A1" ໃນແຜ່ນງານປັດຈຸບັນ.

3. ໄປທີ່ Tools - Macros - Run Macros .

4. ເລືອກ My Macros - sf_test ໃນຕົວເລືອກຫ້ອງສະໝຸດ. ຈາກນັ້ນເລືອກຟັງຊັນ increment_cell ພາຍໃຕ້ລາຍການ Macro Name.

5. ຄລິກ Run. ສັງເກດເຫັນວ່າຄ່າໃນເຊວ "A1" ຖືກເພີ່ມຂຶ້ນ 1.

ທ່ານຍັງສາມາດໃຊ້ APSO ເພື່ອລັນສະຄຣິບ Python ໃນລັກສະນະດຽວກັນໄດ້ນຳອີກ:

1. ທຳອິດໃຫ້ເປີດ APSO ໂດຍການໄປທີ່ Tools - Macros - Organize Python Scripts.

2. ໃນລາຍການມາໂຄຣ, ໃຫ້ເຂົ້າໄປທີ່ My Macros - sf_test - increment_cell.

3. ຄລິກ Execute.

## ການລັນສະຄຣິບແຍກຕ່າງຫາກຈາກໂປຣເຊສຂອງ LibreOffice

### ການກວດສອບເສັ້ນທາງການຕິດຕັ້ງ (Installation Path)

ຂັ້ນຕອນທຳອິດໃນການລັນສະຄຣິບຈາກໂປຣເຊສທີ່ແຍກຕ່າງຫາກແມ່ນການຊອກຫາໂຟນເດີທີ່ LibreOffice ຖືກຕິດຕັ້ງໄວ້. ມີຫຼາຍວິທີໃນການເຮັດແບບນັ້ນ, ແຕ່ ScriptForge ໃຫ້ວິທີທີ່ວ່ອງໄວໃນການລະບຸເສັ້ນທາງການຕິດຕັ້ງຂອງທ່ານ. ສຳລັບເລື່ອງນັ້ນ, ໃຫ້ເປີດ APSO's Python shell ແລະ ພິມ:

        from scriptforge import CreateScriptService
        fs = CreateScriptService("FileSystem")
        fs.FileNaming = "SYS"
        inst_dir = fs.InstallFolder
        print(inst_dir)

ຜົນໄດ້ຮັບຈາກໂຄດດ້ານເທິງແມ່ນໄດເຣັກທໍຣີຫຼັກ (base directory) ທີ່ LibreOffice ຖືກຕິດຕັ້ງໄວ້. ຕອນນີ້ທ່ານຈຳເປັນຕ້ອງເພີ່ມໂຟນເດີຍ່ອຍ "program" ລົງໃນເສັ້ນທາງດັ່ງກ່າວ. ນີ້ແມ່ນໂຟນເດີຫຼັກທີ່ທ່ານຈະໃຊ້ລັນສະຄຣິບ Python ຈາກໂປຣເຊສທີ່ແຍກຕ່າງຫາກ.

ຕົວຢ່າງເຊັ່ນ: ສົມມຸດວ່າທ່ານໄດ້ຮັບ /usr/lib/libreoffice/ ເປັນຜົນໄດ້ຮັບຈາກການລັນໂຄດ Python ດ້ານເທິງ. ຈາກນັ້ນທ່ານຈຳເປັນຕ້ອງຖືວ່າ /usr/lib/libreoffice/program ເປັນເສັ້ນທາງໃນການລັນສະຄຣິບ Python ຂອງທ່ານ.

### Start LibreOffice with socket settings

ເພື່ອລັນສະຄຣິບ Python ຈາກໂປຣເຊສທີ່ແຍກຕ່າງຫາກ, ທ່ານຈຳເປັນຕ້ອງເລີ່ມ LibreOffice ດ້ວຍຕົວເລືອກເພີ່ມເຕີມບາງຢ່າງທີ່ລະບຸ hostname ແລະ port ເຊິ່ງໂປຣເຊສພາຍນອກຈະໃຊ້ເພື່ອສື່ສານກັບໂປຣເຊສຄອມໂພເນນຂອງ LibreOffice.

Open the your operating system's command prompt, navigate to the program folder of your LibreOffice installation directory and type:

./soffice --accept='socket,host=localhost,port=2021;urp;'

The command above will start LibreOffice with a communication channel open so that other processes can exchange messages with it.

Note that the previous example opens LibreOffice start center. If you want to open a specific component, for instance Writer, you can add the --writer flag to the command, as follows.

./soffice --writer --accept='socket,host=localhost,port=2021;urp;'

Take note of the host and port parameters, which in this example are localhost and 2021, respectively.

### ການລັນ External Python Shell

ເລີ່ມ Python shell ຈາກພາຍໃນໂຟນເດີ program ທີ່ຢູ່ໃນເສັ້ນທາງການຕິດຕັ້ງ LibreOffice ຂອງທ່ານ. ປະຕິບັດຕາມຂັ້ນຕອນ ດ້ານເທິງ ເພື່ອຮຽນຮູ່ວິທີການຊອກຫາເສັ້ນທາງການຕິດຕັ້ງຂອງທ່ານ.

ໃນ Linux / Mac OS:

$ cd /usr/lib/libreoffice/program

$ python

ໃນ Windows:

$ cd C:\Program Files\LibreOffice\program\

$ python.exe

This will open the Python shell and now you can start typing commands that will be executed by LibreOffice. But first you need to set up the socket connection.

        from scriptforge import ScriptForge, CreateScriptService
        ScriptForge(hostname='localhost', port=2021)

ອ່ານພາກ ການຕັ້ງຄ່າ PYTHONPATH ດ້ານລຸ່ມນີ້ ໃນກໍລະນີທີ່ເກີດຂໍ້ຜິດພາດໃນການນຳເຂົ້າ scriptforge.py ຫຼື uno.py.

The second line of code above defines the host and port settings so that the Python shell can communicate with an ongoing LibreOffice process opened with the same socket settings.

ຕອນນີ້ທ່ານສາມາດລັນຄຳສັ່ງ Python ອື່ນໆ ແລະ ພວກມັນຈະສາມາດສື່ສານກັບຂະບວນການ LibreOffice ໄດ້. ຕົວຢ່າງ:

        ui = CreateScriptService("UI")
        bas = CreateScriptService("Basic")
        doc = ui.OpenDocument("~/Documents/myFile.ods")
        bas.MsgBox(doc.DocumentType)

### ການຕັ້ງຄ່າ PYTHONPATH

ອີງຕາມການກຳນົດຄ່າລະບົບປະຕິບັດການຂອງທ່ານ ທ່ານຈະຕ້ອງຕັ້ງຄ່າຕົວແປສະພາບແວດລ້ອມ PYTHONPATH ເພື່ອນຳເຂົ້າໄລບຣາຣີ scriptforge.py, ເຊິ່ງຈຳເປັນຕ້ອງມີການນຳເຂົ້າໄລບຣາຣີ uno.py ນຳ.

ໃຊ້ເຄື່ອງມືຄົ້ນຫາໄຟລ໌ຂອງລະບົບປະຕິບັດການຂອງທ່ານເພື່ອລະບຸໄດເຣັກທໍຣີທີ່ໄຟລ໌ທັງສອງນີ້ຕັ້ງຢູ່.

ຕົວຢ່າງ, ໃນການຕິດຕັ້ງ Ubuntu ແບບເລີ່ມຕົ້ນ ໄຟລ໌ທັງສອງອາດຈະຕັ້ງຢູ່ທີ່:

- scriptforge.py: ຕັ້ງຢູ່ທີ່ /usr/lib/libreoffice/program

- uno.py: ຕັ້ງຢູ່ທີ່ /usr/lib/python3/dist-packages

ໃນກໍລະນີນີ້, ໃຫ້ຕັ້ງຕົວແປສະພາບແວດລ້ອມ PYTHONPATH ດັ່ງຕໍ່ໄປນີ້ ກ່ອນທີ່ຈະເລີ່ມຕົວແປພາສາ Python:

export PYTHONPATH=/usr/lib/libreoffice/program:/usr/lib/python3/dist-packages

ຕຳແໜ່ງຂອງໄຟລ໌ເຫຼົ່ານີ້ຈະແຕກຕ່າງກັນໄປຕາມແຕ່ລະລະບົບປະຕິບັດການ ແລະ ວິທີການຕິດຕັ້ງ LibreOffice.

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

ຄັງສຳນວນ ScriptForge

ການຊ່ວຍເຫຼືອສະຄຣິບ Python ຂອງ LibreOffice

ການເລີ່ມຕົ້ນຊອບແວ LibreOffice ດ້ວຍຕົວປ່ຽນຄຳສັ່ງ (Parameters)

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