easymacro/docs/source/tools.rst

758 lines
13 KiB
ReStructuredText

Tools
=====
Remember, always import library first.
.. code-block:: python
import easymacro as app
Info from PC
------------
Operate system
^^^^^^^^^^^^^^
.. code-block:: python
app.msgbox(app.OS)
.. image:: _static/images/tools_01.png
Desktop
^^^^^^^
Name desktop, only GNU/Linux
.. code-block:: python
app.msgbox(app.DESKTOP)
.. image:: _static/images/tools_02.png
Name PC
^^^^^^^
.. code-block:: python
app.msgbox(app.PC)
.. image:: _static/images/tools_03.png
Current user
^^^^^^^^^^^^
.. code-block:: python
app.msgbox(app.USER)
.. image:: _static/images/tools_04.png
Is Windows
^^^^^^^^^^
.. code-block:: python
app.msgbox(app.IS_WIN)
.. image:: _static/images/tools_05.png
Is Mac
^^^^^^
.. code-block:: python
app.msgbox(app.IS_MAC)
.. image:: _static/images/tools_05.png
Info from LibO
--------------
Application name
^^^^^^^^^^^^^^^^
.. code-block:: python
app.msgbox(app.NAME)
.. image:: _static/images/tools_06.png
Version
^^^^^^^
.. code-block:: python
app.msgbox(app.VERSION)
.. image:: _static/images/tools_07.png
Language
^^^^^^^^
.. code-block:: python
app.msgbox(app.LANG)
.. image:: _static/images/tools_08.png
Language with variant
^^^^^^^^^^^^^^^^^^^^^
.. code-block:: python
app.msgbox(app.LANGUAGE)
.. image:: _static/images/tools_09.png
Message Box
-----------
.. code-block:: python
app.msgbox('Damed World', 'My Macro')
.. image:: _static/images/tools_10.png
Show warning box
----------------
.. code-block:: python
message = 'Caution, this action is dangerous'
title = 'My App'
app.warning(message, title)
.. image:: _static/images/tools_11.png
Show error box
--------------
.. code-block:: python
message = 'ERROR: Contact technical support'
title = 'My App'
app.errorbox(message, title)
.. image:: _static/images/tools_12.png
Make question
-------------
.. code-block:: python
message = 'Is easy Python?'
title = 'My App'
result = app.question(message, title)
app.msgbox(result)
.. image:: _static/images/tools_13.png
InputBox
^^^^^^^^
* Normal data
.. code-block:: python
message = 'Type your name'
default = ''
title = 'My App'
result = app.inputbox(message, default, title)
app.msgbox(result)
* Private data
.. code-block:: python
message = 'Type your password'
default = ''
title = 'My App'
echochar = "*"
result = app.inputbox(message, default, title, echochar)
app.msgbox(result)
Date and times
--------------
Get today
^^^^^^^^^
.. code-block:: python
d = app.dates
app.msgbox(d.today)
.. image:: _static/images/tools_14.png
Get now
^^^^^^^
.. code-block:: python
d = app.dates
app.msgbox(d.now)
.. image:: _static/images/tools_15.png
Get `Unix Time`_
^^^^^^^^^^^^^^^^
.. code-block:: python
d = app.dates
app.msgbox(app.d.epoch)
.. image:: _static/images/tools_16.png
Simple measure time
^^^^^^^^^^^^^^^^^^^
.. code-block:: python
d = app.dates
d.start()
app.sleep(5)
seconds = d.end()
app.msgbox(seconds)
.. image:: _static/images/tools_17.png
.. image:: _static/images/tools_18.png
Make date
^^^^^^^^^
.. code-block:: python
d = app.dates
date = d.date(1974, 1, 15)
app.msgbox(date)
.. image:: _static/images/tools_19.png
.. note::
Start date in Python and Calc is diferent.
String to date
^^^^^^^^^^^^^^
See `Python strftime cheatsheet <https://strftime.org/>`_
.. code-block:: python
d = app.dates
str_date = '1974-01-15'
template = '%Y-%m-%d'
date = d.str_to_date(str_date, template)
app.msgbox(type(date))
.. image:: _static/images/tools_20.png
|
For correct date for Calc.
.. code-block:: python
d = app.dates
str_date = '1974-01-15'
template = '%Y-%m-%d'
date = d.str_to_date(str_date, template, True)
app.msgbox(type(date))
.. image:: _static/images/tools_21.png
Calc to date
^^^^^^^^^^^^
Get star date in Calc configuration.
.. code-block:: python
d = app.dates
cell_value = 1
date = d.calc_to_date(cell_value)
app.msgbox(date)
.. image:: _static/images/tools_22.png
Thread
------
You can execute any macro in thread
Normal execution
^^^^^^^^^^^^^^^^
.. code-block:: python
def show_time(seconds):
app.sleep(seconds)
app.msgbox(app.NAME)
return
def main(args=None):
show_time(5)
app.msgbox('Finish...')
return
Run in thread
^^^^^^^^^^^^^
.. code-block:: python
@app.run_in_thread
def show_time(seconds):
app.sleep(seconds)
app.msgbox(app.NAME)
return
def main(args=None):
show_time(5)
app.msgbox('Finish...')
return
Dictionary to/from Properties
-----------------------------
.. code-block:: python
args = {
'Hidden': True,
'Password': 'letmein',
}
properties = app.dict_to_property(args)
app.msgbox(properties)
data = app.data_to_dict(properties)
app.msgbox(data)
Tuples or lists to dictionary
-----------------------------
.. code-block:: python
tuple_of_tuples = (
('Hidden', True),
('Password', 'letmein'),
)
data = app.data_to_dict(tuple_of_tuples)
app.msgbox(data)
list_of_lists = [
['Hidden', True],
['Password', 'letmein'],
]
data = app.data_to_dict(list_of_lists)
app.msgbox(data)
Json
----
Dumps data
^^^^^^^^^^
.. code-block:: python
data = {
'Hidden': True,
'Password': 'letmein',
}
json = app.json.dumps(data)
app.msgbox(json)
Loads data
^^^^^^^^^^
.. code-block:: python
data = app.json.loads(json)
app.msgbox(data)
Call Macros
-----------
You can execute any macro, for default call macros Python.
.. code-block:: python
def show_message():
app.msgbox(app.INFO_DEBUG)
return
def main(args=None):
args = {
'library': 'test',
'name': 'show_message',
}
app.macro.call(args)
return
Of course is better call directly if both macros are the same languaje, but, you can call macro in Basic too.
.. code-block:: vbnet
Sub show_message()
MsgBox "Basic from Python"
End Sub
Call from Python with.
.. code-block:: python
args = {
'language': 'Basic',
'library': 'Standard',
'module': 'Module1',
'name': 'show_message',
}
app.call_macro(args)
Execute macro in other thread
.. code-block:: python
app.call_macro(args, True)
Call external program
---------------------
.. code-block:: python
app_name = 'gnome-calculator'
app.shell.run(app_name)
app.debug(app_name)
Call command line and capture output
.. code-block:: python
args = 'ls -lh ~'
result = app.shell.run(args, True)
app.debug(result)
.. code-block:: bash
21/06/2021 22:27:22 - DEBUG - total 1.3M
drwxr-xr-x 5 mau mau 4.0K Jun 17 13:09 Desktop
drwxr-xr-x 6 mau mau 4.0K Jun 15 12:35 Documents
drwxr-xr-x 2 mau mau 4.0K Jun 21 20:26 Downloads
drwxr-xr-x 2 mau mau 4.0K Jun 21 16:18 Pictures
drwxr-xr-x 13 mau mau 4.0K Jun 21 15:34 Projects
drwxr-xr-x 2 mau mau 4.0K May 11 18:48 Templates
drwxr-xr-x 2 mau mau 4.0K Jun 20 23:27 Videos
Call command line and capture output line by line.
.. code-block:: python
args = 'ls -lh /home/mau'
for line in app.popen(args):
app.debug(line)
.. code-block:: bash
21/06/2021 22:34:42 - DEBUG - total 1.3M
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 5 mau mau 4.0K Jun 17 13:09 Desktop
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 6 mau mau 4.0K Jun 15 12:35 Documents
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K Jun 21 20:26 Downloads
21/06/2021 22:34:42 - DEBUG - -rw-r----- 1 mau mau 1.3M Jun 14 11:53 out.png
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K Jun 21 16:18 Pictures
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 13 mau mau 4.0K Jun 21 15:34 Projects
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K May 11 18:48 Templates
21/06/2021 22:34:42 - DEBUG - drwxr-xr-x 2 mau mau 4.0K Jun 20 23:27 Videos
Timer
-----
Only once
^^^^^^^^^
Execute any macro only once in N seconds.
.. code-block:: python
TIMER_NAME = 'clock'
def show_time():
app.debug(app.dates.time)
return
def start_clock():
seconds = 5
macro = {
'library': 'test',
'name': 'show_time',
}
app.timer.once(TIMER_NAME, seconds, macro)
return
def main(args=None):
start_clock()
return
Cancel execution, before start.
.. code-block:: python
TIMER_NAME = 'clock'
def show_time():
app.debug(app.dates.time)
return
def start_clock():
seconds = 60
macro = {
'library': 'test',
'name': 'show_time',
}
app.timer.once(TIMER_NAME, seconds, macro)
return
def stop_clock():
app.timer.cancel(TIMER_NAME)
return
.. code-block:: bash
26/02/2022 12:23:09 - INFO - Event: "clock", started... execute in 60 seconds
26/02/2022 12:23:16 - INFO - Cancel event: "clock", ok...
Every seconds
^^^^^^^^^^^^^
Execute any macro every seconds.
.. code-block:: python
TIMER_NAME = 'clock'
def show_time():
app.debug(app.dates.time)
return
def start_clock():
seconds = 1
macro = {
'library': 'test',
'name': 'show_time',
}
app.timer.start(TIMER_NAME, seconds, macro)
return
def stop_clock():
app.timer.stop(TIMER_NAME)
return
def main(args=None):
start_clock()
return
Execute **stop_clock** for stop timer.
.. code-block:: bash
26/02/2022 11:28:01 - INFO - Timer 'clock' started, execute macro: 'show_time'
26/02/2022 11:28:02 - DEBUG - 11:28:02
26/02/2022 11:28:03 - DEBUG - 11:28:03
...
26/02/2022 11:28:08 - DEBUG - 11:28:08
26/02/2022 11:28:09 - DEBUG - 11:28:09
26/02/2022 11:28:10 - INFO - Timer stopped...
.. note::
Be sure to use a unique name for each timer.
.. warning::
Be sure to macro for execute not block UI LibO
Get digest
----------
For default get digest in hex
.. code-block:: python
data = 'LibreOffice with Python'
digest = app.hash.digest('md5', data)
app.debug('MD5 = ', digest)
digest = app.hash.digest('sha1', data)
app.debug('SHA1 = ', digest)
digest = app.hash.digest('sha256', data)
app.debug('SHA256 = ', digest)
digest = app.hash.digest('sha512', data)
app.debug('SHA512 = ', digest)
# Get bytes
digest = app.hash.digest('md5', data, False)
app.debug('MD5 = ', digest)
.. code-block:: bash
26/02/2022 15:57:53 - DEBUG - MD5 = e0cb96d2c04b26db79dbd30c4d56b555
26/02/2022 15:57:53 - DEBUG - SHA1 = 7006fb17b7a235245cfc986710a11f10543ae10d
26/02/2022 15:57:53 - DEBUG - SHA256 = 3fe4586d51fa3e352ec28c05b7e71eaee2e41d5ee78f372c44eeb2f433f7e002
26/02/2022 15:57:53 - DEBUG - SHA512 = b6eaea6bc11956eae7f990034ff950eba4b0fe51a577d301272cc8b4c1c603abd36ce852311766e5af2f603d1d96741797b62d4b405459348bacae7ec54e2982
26/02/2022 15:57:53 - DEBUG - MD5 = b'\xe0\xcb\x96\xd2\xc0K&\xdby\xdb\xd3\x0cMV\xb5U'
Save and get configurations
---------------------------
You can save any data.
.. code-block:: python
my_app = 'my_extension'
data = {
'path': '/home/mau/work',
'save_data': True,
}
if app.config.set(my_app, data):
app.msgbox('Save config')
path = app.config.get(my_app)
app.msgbox(data)
You can get any key
.. code-block:: python
path = app.config.get(my_app, 'path')
app.msgbox(path)
Render string
-------------
.. code-block:: python
template = """Hello $name
I send you this $file_name
Best regards
"""
data = {'name': 'Ingrid Bergman', 'file_name': 'letter_love.odt'}
render = app.render(template, data)
app.msgbox(render)
Simple url open
---------------
Get text data
^^^^^^^^^^^^^
.. code-block:: python
url = 'https://api.ipify.org'
result, headers, err = app.url.get(url)
if err:
app.error(err)
else:
app.debug(type(result), result)
app.debug(headers)
.. image:: _static/images/tools_23.png
|
Get json data
^^^^^^^^^^^^^
.. code-block:: python
url = 'https://api.ipify.org?format=json'
result, headers, err = app.url.get(url, json=True)
if err:
app.error(err)
else:
app.debug(type(result), result)
app.debug(headers)
.. image:: _static/images/tools_24.png
|
Color
-----
Look colors that you can used in `web colors`_
.. code-block:: python
color_name = 'darkblue'
color = app.color(color_name)
app.debug(color)
color_rgb = (125, 200, 10)
color = app.color(color_rgb)
app.debug(color)
color_html = '#008080'
color = app.color(color_html)
app.debug(color)
.. _Unix Time: https://en.wikipedia.org/wiki/Unix_time
.. _web colors: https://en.wikipedia.org/wiki/Web_colors