здравствуйте, самый простой messagebox в Python
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw() # эта функция скрывает основное окно программы
messagebox.showwarning("Предупреждение","Текст предупреждения")
а вот в Python для либры пока не могу понять как запускать
насколько я понял в нужно открыть LO-Python (который в LibreOffice\program\python,exe)
появится консоль, справа от >>> нужно ввести pip install tkinter получится
>>> pip install tkinter
нажимаю Энтер, получаю
>>> pip install tkinter
File "<stdin>", line 1
pip install tkinter
^
SyntaxError: invalid syntax
ЧЯДНТ? спасибо
Всё делаете не так. Вам приводят примеры, вы их игнорите. pip запускается в консоли Ctrl+R cmd а не сеансе интерпретатора Питона. И не надо ставить tkinter - потратите день на это.
Цитата: economist от 12 января 2024, 07:30не надо ставить tkinter - потратите день на это
ну ок
по выложенной мне ссылке, посмотрел, код:
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS
def msgbox(message, title='LibreOffice', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'):
""" Create message box
type_msg: infobox, warningbox, errorbox, querybox, messbox
https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1XMessageBoxFactory.html
"""
toolkit = create_instance('com.sun.star.awt.Toolkit')
parent = toolkit.getDesktopWindow()
mb = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message))
return mb.execute()
единственное, что могу сказать из этого кода на 1-ю строку НЕ ругается но как быть когда в файле будет две функции у меня есть функция def Helpik и теперь ещё будет def msgbox она относительно всего кода функции def Helpik будет смещена вправо на один отступ?, а текст message куда вписать во вторую строку?
def msgbox(message='ТО, что нужно', title='LibreOffice', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'):
или задавать ниже под return?
message='ТО, что нужно'?
спасибо
В Питоне исповедуется хороший принцип "наименьшего удивления". Но выше его стоят "значащие отступы", их надо или принять, или учить другой язык.
Если писать код в нормальной IDE (для Python их десятки), то там отступы при наборе появляются/исчезают автоматически. Отступы заставляют писать красиво, а красиво - значит структурно (вверху функции, они же же процедуры, внизу - сам код, дергающий функции). Все это 100500 раз описано понятным языком в отличных бесплатных книжках, разбросанных буквально на каждом шагу.
Функции в питон-коде принято отделять 2-мя пустыми строками, имена переменных и UDF - мелкими буквами, допустим только _ из символов, это правила хорошего тона прежде всего к себе. Использование UDF msgbox предполагает примерно такую структуру:
def msgbox(...):
...
return ...
def helpik(...):
...
return ...
# тут основной код, в котором UDF вызываются в любом месте и как угодно, вызов м.б. вложенным
# UDF м.б. в кач-ве аргумента другой UDF - т.е. полная свобода. Например:
a = msgbox('Привет, Мир!')
b = msgbox(
'''
Или многострочный, в "тройных одинарных" кавычках
текст с переносами строк
и другими другими (двойными) " кавычками в любом месте
'''
)
спасибо за ответ, про эту информацию я знаю, я говорю о том, что если я так сделаю, тогда я получу, смотрите скрин и что мне запускать? мне то нужно запустить функцию def helpik и чтобы в ней выполнилась функция def msgbox, как это сделать?
Нужно написать 3-функцию и вызывать ее:
def main():
helpik()
msgbox()
# или helpik(msgbox())
# или просто helpik(), если внутри ее есть вызов msgbox())
я запускаю в либре код из поста № 2 получаю ошибку create_instance is not defined как исправить?
Разбираться с чужим кодом лень, проще свой написать. Из всех путей надо выбирать простой, но перспективный.
Сначала в консоли в папке LO program
pip install pyautogui
UPD: Если в системе наставлено много питонов, в переменных окружения черти что или исползуются виртуальные окружения, то лучше так:
python -m pip install pyautogui
После этого все чуть проще:
import pyautogui
def msg():
pyautogui.alert(text='Привет!', title='Окно из pyautogui', button='OK')
Конечно, аргументы надо перенести в def(), но главное - результат. Скрипт запускается из LO любым способом (Сервис-Макросы-Управление или APSO), а также работает из кода Basic через invoke() и может возвращать ответ пользователя (нажатие кнопок), но для этого в def msg() надо дописать return
Цитата: economist от 12 января 2024, 10:46в консоли в папке LO program
так и не пойму где это, если в консоле, которая появляется после запуска C:\Program Files\LibreOffice\program\python.exe, то я там получаю:
>>> pip install pyautogui
File "<stdin>", line 1
pip install pyautogui
^
SyntaxError: invalid syntax
Win+R
cmd
cd "C:\Program Files\LibreOffice\program\"
python -m pip install pyautogui
Цитата: economist от 12 января 2024, 07:30примеры, вы их игнорите. pip запускается в консоли Ctrl+R cmd а не сеансе интерпретатора Питона.
Не люблю повторяться. Не спешите, кавалерийский наскок тут не поможет. Макросы это вообще про медитативный процесс.
А чтобы не терять контекст - важно ограничивать число левых движений. Ясная формулировка задачи - 50% ее решения. Никто кроме вас не знает для чего вам msgbox - Показать ОК? Выдать 3 кнопки? Выдать диалог с чекбоксами, списками итд? Выдать красивую таблицу с форматированным текстом? Незнание порождает домыслы и уход в сторону. А нужно больше самостоятельной работы. Вот я, честно говоря, пишу тут чтобы это еще кому-то пригодилось (и мне в т.ч). Группы в соцсетях в этом смысле - "деньги на ветер", их не индексируют великие поисковики, и их польза мимолетна. Но чтобы придать больше смысла в ветку - надо его вкладывать в каждый пост.
Цитата: economist от 12 января 2024, 11:07Win+R
cmd
cd "C:\Program Files\LibreOffice\program\"
python -m pip install pyautogui
скажите а этот совет можно было-бы выполнить и кодом
примерно так:
import subprocess
def run_cmd(cmd):
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
return out, err
out, err = run_cmd("pip install pyautogui")
if err:
print("Ошибка:", err)
else:
print("Успешно:", out)
я не претендую, что он верный если НЕ верный и поправите - может кому сгодится
сейчас у меня вопросов нет, всё сделал, спасибо
я про то, что я Win+R сегодня первый раз в жизни нажимал, обычно в поиск вводил всегда Выполнить - и то редко, а если бы в совете был код - я бы вмиг сделал
на вопрос
Цитата: economist от 12 января 2024, 11:19Ясная формулировка задачи - 50% ее решения. Никто кроме вас не знает для чего вам msgbox - Показать ОК? Выдать 3 кнопки? Выдать диалог с чекбоксами, списками итд? Выдать красивую таблицу с форматированным текстом? Незнание порождает домыслы и уход в сторону.
позволю себе ответить с другого топика:
Цитата: Ципихович Эндрю от 11 января 2024, 09:54подскажите я так и не понял в листинге def должен быть один?
я про то, чтобы сделать поизящнее, заменить сообщение в документе
ЦитироватьНачато: 2024-01-10 12:33:25.527330
Окончено: 2024-01-10 12:41:12.017161
Продолжительность работы программы: 0:07:46.489831
Вставлено документов в текущий документ: 30
Количество сделанных замен chr(160) на пробел: 144
на
Код Выделить Развернуть
from tkinter import *
def MsgBoxOk(title, txt_sms):
def click_button():
по моему всё предельно ясно, спасибо ещё раз
а так цена вопроса две строки кода, импорт модуля:
import pyautogui
вывод сообщения:
pyautogui.alert(text='Привет!', title='Окно из pyautogui', button='OK')
ну и совет:
Цитата: economist от 12 января 2024, 11:07Win+R
cmd
cd "C:\Program Files\LibreOffice\program\"
python -m pip install pyautogui
который я не до конца понимаю - он из разряда, одни люди сделали, чтобы другие мучились....
pyautogui, если задуматься, одна одна из самых полезных либ для около-офисных применений, там где нужна интероперабельность, взаимодействие с другим софтом, клавой, мышей, юзером и замена его на "робота". Макросы это как раз про роботизацию, и чем раньше это станет ясно - тем дальше удастся пройти в других проектах.
Tkinter по каким-то причинам был выпилен разработчиками из LO-Python, и даже если его впилить обратно - не факт что он переживет обновление. Надо избегать таких либ, тем более что он далеко не прост и красивого, не а-ля 90-е вида с ним добиться очень сложно, обычные питонисты его недолюбливают. Стандартные msgbox в LO Basic и то выглядят по приятнее, хотя и в них много изъянов.
Самое простой msgboxв OpenOffice|LibreOffice, какой только можно придумать - это LO Basic и его msgbox. Чтобы вывести в него результат работы Python-скрипта или просто сообщение - можно сделать так, и это я предлагал в самом-самом начале, методом invoke():
Sub out_from_pyscript()
parameters = "" 'если нужно передать параметр(ы) py-скрипту
script = "test.py"
script = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory").createScriptProvider("")._
getScript("vnd.sun.star.script:" & script & "$msg?language=Python&location=share")
msg = script.invoke(array(parameters), array(), array()) ' если не array("") а array() - будет ошибка!
msgbox(msg)
End sub
Скрипт *.py должен содержать def msg(), лежать в share и иметь return. APSO может внедрить *.py в ODS/ODT-файл. По такому же принципу *.py может вернуть значение(я) в UDF на Basic в ячейку(и) Calc. То есть это хорошо просматриваемое направление интеграции лучшего из двух миров.
С менеджерами контекста и прочими специфичными LO-Python-uno приблудами, конечно, тоже надо бы освоиться, но это точно на потом. Очень мало прошедших по этому пути, больших проектов я не знаю.
Локальную задачу с msgbox из python на том же github решали много раз, например https://github.com/kelsa-pi/unodit/wiki/Simple-dialog-boxes Так что выбрать есть из чего.
Цитата: Ципихович Эндрю от 12 января 2024, 14:34ну и совет:
ЦитироватьWin+R
cmd
cd "C:\Program Files\LibreOffice\program\"
python -m pip install pyautogui
который я не до конца понимаю - он из разряда, одни люди сделали, чтобы другие мучились....
Построчно, жмем клавиши Win+R, копируем команды ниже построчно и жмем Enter, они выполняются, смотрим на вывод, нет ли ошибок, идем ниже. В результате получаем установленную либу в LO-Python
Цитата: Ципихович Эндрю от 12 января 2024, 09:56получаю ошибку create_instance is not defined как исправить?
Добавить функцию create_instance из того же источника (см. приложенный файл).
Цитата: economist от 12 января 2024, 15:15Самое простой msgboxв OpenOffice|LibreOffice, какой только можно придумать - это LO Basic и его msgbox.
Ходатайствую за функцию Python Msgbox (https://wiki.documentfoundation.org/Macros/Python_Guide/Useful_functions#MsgBox) из "LibreOffice Developer's Guide" (я на нее ссылался в предыдущей теме). По крайней мере, макрос hello_world из приложенного файла (у меня) нареканий не вызывает.
Хотя я уже зарекался высказываться на темы, связанные с Python. :)
Цитата: Ципихович Эндрю от 12 января 2024, 14:34цена вопроса две строки кода
а если пойти далее и сделать msgbox по подобию того, какой выдаёт APSO - где можно скопировать текст сообщения, возможно, цена вопроса сколько строк?
кстати если бы не подсказали - я бы не догадался, что там можно копировать - спасибо
Цитата: sokol92 от 12 января 2024, 20:18зарекался высказываться на темы, связанные с Python.
Зря, полезного от вас на Форуме много, а на стыке интересов, технологий, задач, ЯП-ов - возникаем много полезных эффектов. Программирование = творчество (техническое), и здесь уместна вот такая аналогия:
Многим великим музыкантам, по их признанию, сесть творить помогает "пинок". Услыав чужую крутую вещь - они из чувства "Слабо?" и ли еще какого принимаются сами. Вот так и на Форуме - небольшие примеры кода, кейсы, success-story и вообще примеры что во всем этом огромном софте OpenOffice|LibreOffice можно-таки разобраться - воодушевляют. Так что продолжайте в том же духе. Python не станет макроязыком №1 в OpenOffice|LibreOffice, но он же ведет в другие предметные области, которые, прямо скажем, нависают на человечеством.
Цитата: Ципихович Эндрю от 13 января 2024, 08:50msgbox по подобию того, какой выдаёт APSO - где можно скопировать текст
Текст из почти любых MsgBox (и LO Basic) можно копировать (в Linux так вообще почти всё отовсюду копируется). Если текст msgbox приходится копировать - это можно сделать и программно. В Pyton c помощью либы clipboard или pyautogui одной командой, а в LO Basic - многословнее, есть примеры на Форуме.
Цитата: economist от 13 января 2024, 12:26в LO Basic - многословнее, есть примеры на Форуме
можно пожалуйста ссылку боюсь в поиске нужно разбираться долго и не факт, что будет в точку, спасибо
Цитата: economist от 13 января 2024, 12:26есть примеры на Форуме
поискал всего 11 тем, две из них мои, значит остаются 9 - посмотрел не нашёл))
и я ещё не ориентируюсь как на этом ресурсе мухи от котлет оделять))(Питон от бейсика)
Поиск кода макросов, например, по слову clipboard на Форуме своеобразен: "по всем разделам" и из главной страницы он находит не все. Поэтому заходим в "основные" разделы Basic Calc Writer и ищем там.
Например https://forumooo.ru/index.php?msg=21609
там сказано:
Цитата: dndn от 24 июля 2013, 00:57Для экспорта строки в буфер обмена нашел в сети такой код
так речь же о том, как сделать так чтобы была возможность выделить нужное на MsgBox, на MsgBox от Питона, её ведь в MsgBox:
pyautogui.alert(text=txt, title='Сообщение', button='OK')
нет, а уже потом экспорт строки в буфер обмена
и у для общей информации у меня НЕ Linux, винда 10х64 - навсякий
Цитата: Ципихович Эндрю от 13 января 2024, 08:50сделать msgbox по подобию того, какой выдаёт APSO
apso.py (https://gitlab.com/jmzambon/apso/-/blob/master/sources/python/apso.py):
class DialogBase(object):
""" Base class for dialog. """
def __init__(self, ctx):
self.ctx = ctx
self.smgr = ctx.getServiceManager()
def create(self, name, arguments=None):
""" Create service instance. """
if arguments:
return self.smgr.createInstanceWithArgumentsAndContext(
name, arguments, self.ctx)
else:
return self.smgr.createInstanceWithContext(
name, self.ctx)
class MessageDialog(DialogBase):
""" Shows message in standard message box. """
def __init__(self, ctx, parent, **kwds):
DialogBase.__init__(self, ctx)
self.parent = parent
self.args = kwds
def execute(self):
args = self.args
type = args.get("type", MESSAGEBOX)
buttons = args.get("buttons", 1)
title = args.get("title", "")
message = args.get("message", "")
toolkit = self.parent.getToolkit()
dialog = toolkit.createMessageBox(
self.parent, type, buttons, title, message)
n = dialog.execute()
dialog.dispose()
return n
apso_utils.py (https://gitlab.com/jmzambon/apso/-/blob/master/sources/python/pythonpath/apso_utils.py):
def createUnoService(service, ctx=None, args=None):
'''
Instanciate a Uno service.
@service: name of the service to be instanciated.
@ctx: the context if required.
@args: the arguments when needed.
'''
if not ctx:
ctx = uno.getComponentContext()
smgr = ctx.getServiceManager()
if ctx and args:
return smgr.createInstanceWithArgumentsAndContext(service, args, ctx)
elif args:
return smgr.createInstanceWithArguments(service, args)
elif ctx:
return smgr.createInstanceWithContext(service, ctx)
else:
return smgr.createInstance(service)
def msgbox(message, title="Message", boxtype='message', buttons=1, win=None):
'''
Simple message box.
Like the oobasic build-in function msgbox,
but simplified as only intended for quick debugging.
Signature: msgbox(message, title='Message', boxtype='message', buttons=1, win=None).
'''
types = {'message': MESSAGEBOX, 'info': INFOBOX, 'error': ERRORBOX,
'warning': WARNINGBOX, 'query': QUERYBOX}
tk = createUnoService("com.sun.star.awt.Toolkit")
if not win:
desktop = createUnoService("com.sun.star.frame.Desktop")
frame = desktop.ActiveFrame
if frame.ActiveFrame:
# top window is a subdocument
frame = frame.ActiveFrame
win = frame.ComponentWindow
box = tk.createMessageBox(win, types[boxtype], buttons, title, message)
return box.execute()
Ссылка на Basic код для понимания, насколько он сложнее и длиннее чем Python-ий.
Не надо выделять, можно сразу копировать:
import pyperclip # его тянет при установке pyautogui
...
pyperclip.copy(txt)
pyautogui.alert(text=txt, title='Сообщение', button='OK')
...
А если все-таки хочется наглядно кодом выделить текст в msgbox - то pyautogui в помощь. Без этой либы в офисной автоматизации вам не обойтись, как и без чтения ее 29-страничной доки.
Доку для любых Python либ ищем в 3-х местах: pypi.org, "сайт проекта", и страничка с кодом на github.com - все три ссылки обычно рядом в любом из трех названных мест.
Цитата: Ципихович Эндрю от 13 января 2024, 08:50а если пойти далее и сделать msgbox по подобию того, какой выдаёт APSO - где можно скопировать текст сообщения
А что, в примере из #15 нельзя выделить и скопировать текст сообщения (или его часть)?
Михаил в #23 показал исходники из проекта.
Если вы уже скачали расширение apso.oxt, то можете посмотреть и тексты программ в подпапке \python архива, поскольку файлы с расширением .oxt являются архивами (можно, например, добавить расширение .zip и исследовать содержание средствами MS Windows. Я пользуюсь Far Manager, который умеет показывать содержимое любых архивов).
Цитата: sokol92 от 13 января 2024, 14:17А что, в примере из #15 нельзя выделить и скопировать текст сообщения (или его часть)?
там файл ods я не в курсе где и что там находится, так как ексель ещё иногда юзал-давно, а этого зверя Calc тоже щупал ранее чисто из любопытства - но он мне без надобности, так что извините я не не хотел, а не понял, что там и как....
а переспросить видимо забыл))
Открываете .ods (или документ LO иного типа).
Меню / Сервис / Макросы / Выполнить макрос.
Цитата: sokol92 от 13 января 2024, 14:52Открываете .ods (или документ LO иного типа).
Меню / Сервис / Макросы / Выполнить макрос.
так я так делал, а потом насколько я понимаю они должны быть в PyMsgbox.ods, а там есть папка Standard, и она не раскрывается - значит пустая
или как нужно?
В моем примере папка Module (перед Standard).
Цитата: 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()
В ветке 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)
надеюсь понятно что имеется ввиду, можно?, как?
"Красота" потребует жертв (заставит использовать другие либы), писать много кода или рисовать диалог.
Особенно если программа будет работать у других пользователей, у которых:
- разное разрешение (ноутбук 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, главное, чтобы он был в описываемом месте, в той теме коддинг на С++, его я не знаю и думаю, что никто не будет там каждый чих помогать, такие дела....
https://forumooo.ru/index.php?topic=8543
спасибо за ссылку там же речь про решение на бейсике, и в примере документа 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, что посоветуете в плане, чтобы с либрой не было проблем?
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'а можно будет сделать приклеенным, то есть или оно есть или его нет - убрали в случае необходимости? чтобы его нельзя было перетаскивать с места на место
Цитата: Ципихович Эндрю от 15 января 2024, 12:37нужно форму Msgbox добавить, её я экспортировал - файл bas имеется у меня на ПК, но как импортировать именно в Writer
Нет никакой "формы Msgbox", ее нельзя экспортировать. В файл BAS можно экспортировать только код, это лишняя операция, можно просто скопировать код.
@sokol92 в #15 привел вам пример файла Calc (*.ods) в который Python-код для вызова msgbox
внедрен (вручную или с помощью APSO - Menu - Create module). Чтобы это работало и во Writer - вам тоже нужно внедрить py-код в *.odt - файл.
Если py не внедрять, а просто положить где надо (это два других доступных места - Мои макросы, Макросы LibreOffice) - возможно придется что-то поправить.
Цитата: Ципихович Эндрю от 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 мм - вот в этих местах можно ли для начала нарисовать окошко на всю высоту рабочей области листа? как?
в том месте что оно может закрыть? то есть мне нужно, чтобы НЕ было возможности взять за шапку и таскать окно по экрану
Думаю это невозможно с окном.
LibreOffice позволяет создание сложных диалогов, в том числе:
- не перемещаемых
- изменяемых в размерах
- внутри окон документов или как независимое окно в приложении
и т.д.
Но это уже для "магистров". :)
Сказанное относится именно к диалогам, а не конкретно к (системному диалогу) Msgbox.
Могу, когда появится время, выложить примеры (но не готов давать подробные пояснения).
Цитата: sokol92 от 15 января 2024, 17:24Могу, когда появится время, выложить примеры (но не готов давать подробные пояснения)
ну хоть так....спасибо
Вот, собрал пример из подручных средств.
1. Макрос ResizableDialog создает немодальный диалог, размеры которого пользователь может менять на лету.
Для завершения диалога нужно нажать Esc.
Диалог содержит текстовое поле, размеры которого меняются при изменении размера диалог. Можно поместить в это поле (длинный) текст и наблюдать, как будут производиться переносы слов при изменении размера.
2. Макрос NonMoveableDialog создает немодальный неперемещаемый диалог. Стартовые координаты можно изменить при вызове метода oContainer.setPosSize (сейчас это X=100, Y=200).
sokol92, спасибо за файл, я бы мог в ответе #47 попросить "только ради бога приложите пример НЕ в экселе=Calc, а в ворде=Writer"
но получил пример в calc, в программировании я начинал с vba, правда несколько последних лет к нему не возвращаюсь, и по моему как ни крути либру сделали полностью глядя на ворд, а нынешний мойофисс тем паче ваяют по подобии их обоих и привносят что-то своё
я к тому, что моих знаний в vba недостаточно для освоения либры, а жаль...
на скрине видно, что открыт файл Calc "Dialogs.ods" и открыт файл Writer "Без имени 1" - сейчас проверил у офиса от майкрософта такое невозможно)) тут каждый думает хорошо это или плохо....
так вопросов два:
у файла "Dialogs.ods" ниже под модулем "Module1" находится "Dialod3" это я бы сказал форма - что это на либровском языке?
как из папки "Standart" файла "Dialogs.ods" всё закинуть, в папку "Standart" файла "Без имени 1"?
спасибо
Цитата: Ципихович Эндрю от 16 января 2024, 10:50"Standart" файла "Dialogs.ods" всё закинуть, в папку "Standart" файла "Без имени 1"
находясь в Dialogs.ods жмем Alt+F11, в появившемся окне кнопку Управление... , далее закладка диалоги, раскрываем стрелочками все подпунктики и с зажатым Ctrl тянем dialog3 из библиотеки Standart Dialogs.ods в библиотеку odt файла. Аналогично с макросами только тянем модуль
bigor - понятно, спасибо сделано
меня вот тот элемент заинтересовал который внутри окна, в который можно вводить текст (заинтересовал тем, что у него имеется возможность переносить строки) он как называется? не в курсе есть такой элемент в вба от ворда?
а есть такой же элемент, чтобы также был перенос строк но без ввода текста - лейбл в либре, как называется?
спасибо
у меня в ворде подобное сделано, но в используемом элементе нет возможности переносить строки, я забыл его название, да и проект ещё потерялся, найду проект узнаю об элементе - будет более предметный разговор...
В "русскоязычном" интерфейсе элемент управления для ввода текста называется "Текстовое поле" (UnoControlEdit (https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1awt_1_1UnoControlEdit.html)).
За перенос слов отвечает свойство "Многострочный ввод" (MultiLine (https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1awt_1_1UnoControlEditModel.html#afb440b6460d9580ab91a3fed3dd3670b)).
Элемент управления для отображения неизменяемого текста называется "Метка" (UnoControlFixedText (https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1awt_1_1UnoControlFixedText.html)). За перенос слов отвечает свойство с тем же именем, которое указано выше.
Наконец, соответствующее свойство в Microsoft Forms называется ... MultiLine (https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/multiline-property) (в совокупности с WordWrap (https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/wordwrap-property)).
sokol92 спасибо за ответ, сгубило ведь меня любопытство........ когда я писал пост # 49
тема топика Messagebox Python Writer
Messagebox созданный на Python две строки кода - смотреть # 12
Messagebox созданный на Python, поддающийся копированию - смотреть # 34
остальное можно и затереть - не мне решать
а сейчас то вопрос:
Messagebox созданный на Python, желательно, но не обязательно поддающийся копированию с параметрами x=100, y=100, width=300, height=100 (кому нужно на бейсике - смотреть # 48)
такое можно сваять? спасибо
Если мы работаем с объектами документов LibreOffice, то нет особой разницы между применением Basic и Python. Исключение - функции пользователя, которые используются в формулах на листах документов Calc (UDF - функции).
Я в настоящее время пишу макросы на LO Basic в силу исторических причин (ранее писал (и пишу) на Excel VBA). Не думаю, что при переводе макросов из примера #49 на Python у специалиста по Python возникнут проблемы.
Цитата: sokol92 от 16 января 2024, 20:37из примера #49
ошибка нужно было указать 48
понял