Messagebox Python Writer

Автор Ципихович Эндрю, 12 января 2024, 07:18

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

Цитата: sokol92 от 13 января 2024, 16:00В моем примере папка Module (перед Standard).
я же говорю, смешались в кучу кони, люди... = бейсик, питон
понял, спасибо, запускал
For security reasons, you cannot run this macro.
For more information, check the security settings
=================================================
По соображениям безопасности вы не можете запустить этот макрос.
Для получения дополнительной информации проверьте настройки безопасности.
так а как код посмотреть сего?

Ципихович Эндрю

здравствуйте, с самим мсгбоксом я разобрался
import uno
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS

def create_instance(name, with_context=False):
    CTX = uno.getComponentContext()
    SM = CTX.getServiceManager()
    if with_context:
        instance = SM.createInstanceWithContext(name, CTX)
    else:
        instance = SM.createInstance(name)
    return instance
def msgbox(message='LibreOffice1111', title='LibreOffice', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'):
    toolkit = create_instance('com.sun.star.awt.Toolkit')
    parent = toolkit.getDesktopWindow()
    mb = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message))
    return mb.execute()

я не могу понять, то есть если я раскрою скрипты файла и будет как в данном случае мне предложено к выполнению два скрипта msgbox и create_instance это я должен помнить, что запускать нужно именно msgbox, во всяком случае при запуске create_instance у меня возникает ошибка:
Error during invoking function create_instance in module file:///C:/Program%20Files/LibreOffice/share/Scripts/python/111111.py (<class 'TypeError'>: create_instance() missing 1 required positional argument: 'name'
  File "C:\Program Files\LibreOffice\program\pythonscript.py", line 916, in invoke
    ret = self.func( *args )
)
можно их соединить в один? как?
и ещё пока не подъёмно для меня как соединить мне всё это с функцией helpik в которой нужно запускать msgbox?

Ципихович Эндрю

с вложенность разобрался, подскажите пожалуйста, как в коде:
import os # позволяет работать с файловой системой
from datetime import datetime # позволяет работать с датой
import uno # позволяет открыть файл
import pyautogui # позволяет использовать alert - сообщение
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS # позволяет использовать сообщение, которое можно копировать

def helpik():
    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()
    if not hasattr(model, "Text"):
        model = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, ())
    text = model.Text
    tRange = text
    tRange.String = '' # очищаем документ
    msgbox()
    return None
    def create_instance(name, with_context=False):
        CTX = uno.getComponentContext()
        SM = CTX.getServiceManager()
        if with_context:
            instance = SM.createInstanceWithContext(name, CTX)
        else:
            instance = SM.createInstance(name)
        return instance
    def msgbox(message='LibreOffice1111', title='LibreOffice', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'):
        toolkit = create_instance('com.sun.star.awt.Toolkit')
        parent = toolkit.getDesktopWindow()
        mb = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message))
        return mb.execute()
запустить ниже строки
tRange.String = '' # очищаем документфункцию
msgbox()

economist

В ветке XY-проблема, https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_XY_(%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0_%D0%BC%D0%BE%D0%BB%D0%BE%D1%82%D0%BA%D0%B0)
Как следствие - собрано 5 способов (примеров кода) как вывести msgbox вместо одного-двух.

Ципихович Эндрю, опишите задачу целиком, может есть способ проще. Почему вам скорее всего нужен способ проще? Потому что вы не хотите изучать базовые основы программирования, чтобы знать:
- для чего в скриптах UDF функции вместо длинного "кода-лапши", и почему структурность - это правильно),
- почему нельзя (и не надо) вызывать функцию create_instance() в примерах, для чего def() в Python-коде для вызова из LO
- чем отличается в LO Управление макросами и APSO, почему APSO вообще появился
- как включить макросы в OpenOffice|LibreOffice навсегда, чтобы не спотыкаться хотя бы на этом.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

я уже решил эту задачу, до этого была цена вопроса 2 строки - это был обычный MessageBox, сейчас цена вопроса 15 строк кода:
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS # позволяет использовать MessageBox, поддающийся копированию

def create_instance(name, with_context=False):
    CTX = uno.getComponentContext()
    SM = CTX.getServiceManager()
    if with_context:
        instance = SM.createInstanceWithContext(name, CTX)
    else:
        instance = SM.createInstance(name)
    return instance
def msgbox(message='', title='', buttons='', type_msg=''):
    toolkit = create_instance('com.sun.star.awt.Toolkit')
    parent = toolkit.getDesktopWindow()
    mb = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message))
    return mb.execute()
ну и строка запуска
msgbox(message=txt, title='Сообщение', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox')а эта строка, как говорится вишенка на торте, она в конце скрипта, последняя:
# указанная функция=def будет отображена в Сервис-Макросы-Organize Python scripts
# остальные функции=def НЕ будут отображаться в Сервис-Макросы-Organize Python scripts
g_exportedScripts = helpik,
спасибо за подсказки

Ципихович Эндрю

и опять же к скрипту #35 можно добавить параметры:
msgbox(message=txt, title='Сообщение', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox', x=100, y=100, width=300, height=100)надеюсь понятно что имеется ввиду, можно?, как?

economist

"Красота" потребует жертв (заставит использовать другие либы), писать много кода или рисовать диалог.

Особенно если программа будет работать у других пользователей, у которых:
- разное разрешение (ноутбук  1366х752, стационарные ПК - FHD, 2K, 4K) 
- разный Scale-фактор (масштаб)
- разный размер окна OpenOffice|LibreOffice
- разные шрифты

Лучше красоту отложить на потом, когда всё остальное готово. Окошко по центру - это норма.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

Цитата: economist от 15 января 2024, 10:24"Красота" потребует жертв (заставит использовать другие либы), писать много кода или рисовать диалог.

Особенно если программа будет работать у других пользователей, у которых:
- разное разрешение (ноутбук  1366х752, стационарные ПК - FHD, 2K, 4K) 
- разный Scale-фактор (масштаб)
- разный размер окна OpenOffice|LibreOffice
- разные шрифты

Лучше красоту отложить на потом, когда всё остальное готово. Окошко по центру - это норма.
так я конечно в курсе и понимаю это........
тем не менее как?
это отголоски с другой темы:
Цитата: Ципихович Эндрю от 11 января 2024, 09:08давайте начнём с фактов, мой монитор 28 дюймов, открываю либру
зажав пальцем на клавиатуре клавишу Контрол колёсиком мыши выставил удобный для себя холст в Writer
взял в руки линейку замерил от левого края монитора до начала где можно вводить символы 95 мм
от последнего введённого символа в строке до правого края монитора 115 мм - вот в этих местах можно ли для начала нарисовать окошко на всю высоту рабочей области листа? как?
ну пусть это будет для начала не окошко, а MessageBox, главное, чтобы он был в описываемом месте, в той теме коддинг на С++, его я не знаю и думаю, что никто не будет там каждый чих помогать, такие дела....


economist

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

спасибо за ссылку там же речь про решение на бейсике, и в примере документа Calc всё работает, а я запускал на Writer и на строке
s=oDoc.BasicLibraries.getByName("Standard").getByName("ModDialog")ошибка:
Ошибка времени выполнения Basic.
Вызвано исключение
Type: com.sun.star.container.NoSuchElementException
Message: .
как поправить?
а вообще из этих https://techrocks.ru/2018/04/26/13-python-gui-frameworks/
13 GUI-библиотек Python, что посоветуете в плане, чтобы с либрой не было проблем?

economist

NoSuchElement - нужно до запуска убедиться что:
- объект oDoc задан в коде и существует
- в нем есть библиотека макросов Standard и в ней есть макрос ModDialog 
- если чего-то нет - создать, макрос скопировать

Msgbox-ы встроенные в LO могут вызываться на любом языке (Basic, Python, Java, С++ итд). Но там много ограничений. Там где не хватает msgbox обычно используют рисованный Dialog с контрлами (но в OpenOffice|LibreOffice они тоже выглядят старомодно и тяжело кодятся, мало примеров).

Существует много (сотни) сторонних либ на Python, Java, С++ для построения GUI-приложений, которые можно интегрировать с LO. Про Python не стоит читать статьи 2018 г., это самый популярный язык программирования и он очень быстро развивается. А вот по OO/LO-Basic - наоборот, полезное можно найти и в статьях 2008 г.

С Либрой не будет проблем с любой внешней либой, если сделать правильно. Но правильно - сложно.

Будем реалистами - данный Форум самый дружелюбный по автоматизации OpenOffice|LibreOffice, но на Python местные авторитеты почти не кодят, а кодят на Basic. По нему вы найдете в тысячи раз больше примеров.

Самый простой путь сделать то что вы хотите - я уже писал, это именно Basic:

1) код на Basic что-то делает вначале, например реагирует на нажатую кнопку в Writer/Calc

2) код на Basic вызывает ч/з invoke() внешний или внутр. код на Python и получает от него результат(ы) - строки, массивы, кучку обработанных файлов, запущенные процессы, скачанные сайты, отправленные email (все то, чем силен Python благодаря 500 тыс готовых либ и множествам примеров кода)

3) код на Basic выводит MsgBox (простой или форматированный, с размером, см. #38) со строкой из Python-кода

Все другие варианты - сложнее, требуют учиться и искать ответы не только здесь. Но вы уже получили достаточный опыт, чтобы начать разбираться самому, если не будете уходить в сложности по первым ссылкам в поисковике (на Qt и прочую мега-сложную тематику).

На чем сейчас модно рисовать GUI - это тема для митапов уровня WEF. Есть мощные интерефейсные либы типа PyGUI.
 
Но сейчас всё онлайн, web2.0 итд, поэтому самые красивые, грамотные и функциональные интерфейсы, к том же адаптивные, в основном создаются  на базе web-технологий. Basic страшно далек от этого, а вот Python - в теме (причем на базе либ из чужих языков, в основном из мира JavaScript). Но не сам Python, а "мини" web-фреймворки на нем: Streamlit, Flask итд. Или Eel (Electron). Вот на чем надо писать крутой GUI. А если нужен простой - используйте Basic.   
   
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

Цитата: economist от 15 января 2024, 12:09если чего-то нет - создать, макрос скопировать
понял, нужно форму Msgbox добавить, её я экспортировал - файл bas имеется у меня на ПК, но как импортировать именно в Writer я так и не понял, обратился к Питоняку Э. но много находится и нужного не нашёл, как?
Цитата: economist от 15 января 2024, 12:09Но сейчас всё онлайн, web2.0 итд, поэтому самые красивые, грамотные и функциональные интерфейсы, к том же адаптивные, в основном создаются  на базе web-технологий. Basic страшно далек от этого, а вот Python - в теме (причем на базе либ из чужих языков, в основном из мира JavaScript). Но не сам Python, а "мини" web-фреймворки на нем: Streamlit, Flask итд. Или Eel (Electron). Вот на чем надо писать крутой GUI
а в итоге оно - окно Msgbox'а можно будет сделать приклеенным, то есть или оно есть или его нет - убрали в случае необходимости? чтобы его нельзя было перетаскивать с места на место

economist

Цитата: Ципихович Эндрю от 15 января 2024, 12:37нужно форму Msgbox добавить, её я экспортировал - файл bas имеется у меня на ПК, но как импортировать именно в Writer

Нет никакой "формы Msgbox", ее нельзя экспортировать. В файл BAS можно экспортировать только код, это лишняя операция, можно просто скопировать код.

@sokol92 в #15 привел вам пример файла Calc (*.ods) в который Python-код для вызова msgbox внедрен (вручную или с помощью APSO - Menu - Create module). Чтобы это работало и во Writer - вам тоже нужно внедрить py-код в *.odt - файл.

Если py не внедрять, а просто положить где надо (это два других доступных места - Мои макросы, Макросы LibreOffice) - возможно придется что-то поправить.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Цитата: Ципихович Эндрю от 15 января 2024, 12:37окно Msgbox'а можно будет сделать приклеенным

Удобно когла Окно перетаскивает, ведь оно может закрывать то, что нужно видеть (или не влезать в экран целиком).

Окно м.б. "модальным", то есть блокировать родительское приложение (требовать закрыть себя или что-то сделать, чтобы оно само закрылост). msgbox-ы - такие, т.е. модальные.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ципихович Эндрю

Цитата: economist от 15 января 2024, 15:34@sokol92 в #15 привел вам пример файла Calc (*.ods) в который Python-код для вызова msgbox внедрен (вручную или с помощью APSO - Menu - Create module). Чтобы это работало и во Writer - вам тоже нужно внедрить py-код в *.odt - файл.
так это то я уже сделал, теперь вопрос в том, чтобы добавить параметры:
x=100, y=100, width=300, height=100
Цитата: economist от 15 января 2024, 15:41Удобно когла Окно перетаскивает, ведь оно может закрывать то, что нужно видеть
никто и не спорит, мне то нужно его поместить (цитирование с другого топика):
Цитата: Ципихович Эндрю от 11 января 2024, 09:08давайте начнём с фактов, мой монитор 28 дюймов, открываю либру
зажав пальцем на клавиатуре клавишу Контрол колёсиком мыши выставил удобный для себя холст в Writer
взял в руки линейку замерил от левого края монитора до начала где можно вводить символы 95 мм
от последнего введённого символа в строке до правого края монитора 115 мм - вот в этих местах можно ли для начала нарисовать окошко на всю высоту рабочей области листа? как?
в том месте что оно может закрыть? то есть мне нужно, чтобы НЕ было возможности взять за шапку и таскать окно по экрану