Messagebox Python Writer

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

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

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

здравствуйте, самый простой 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
ЧЯДНТ? спасибо

economist

Всё делаете не так. Вам приводят примеры, вы их игнорите. 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='ТО, что нужно'?
спасибо

economist

#3
В Питоне исповедуется хороший принцип "наименьшего удивления". Но выше его стоят "значащие отступы", их надо или принять, или учить другой язык.

Если писать код в нормальной IDE (для Python их десятки), то там отступы при наборе появляются/исчезают автоматически. Отступы заставляют писать красиво, а красиво - значит структурно (вверху функции, они же же процедуры, внизу - сам код, дергающий функции). Все это 100500 раз описано понятным языком в отличных бесплатных книжках, разбросанных буквально на каждом шагу.

Функции в питон-коде принято отделять 2-мя пустыми строками, имена переменных и UDF - мелкими буквами, допустим только _ из символов, это правила хорошего тона прежде всего к себе. Использование UDF msgbox предполагает примерно такую структуру:


def msgbox(...):
    ...
    return ...


def helpik(...):
    ...
    return ...


# тут основной код, в котором UDF вызываются в любом месте и как угодно, вызов м.б. вложенным
# UDF м.б. в кач-ве аргумента другой UDF - т.е. полная свобода. Например:
a = msgbox('Привет, Мир!')
b = msgbox(
    '''
    Или многострочный, в "тройных одинарных" кавычках 
    текст с переносами строк
    и другими другими (двойными) " кавычками в любом месте
    '''
)




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

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

спасибо за ответ, про эту информацию я знаю, я говорю о том, что если я так сделаю, тогда я получу, смотрите скрин и что мне запускать? мне то нужно запустить функцию def helpik и чтобы в ней выполнилась функция def msgbox, как это сделать?

economist

Нужно написать 3-функцию и вызывать ее:

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

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

я запускаю в либре код из поста № 2 получаю ошибку create_instance is not defined как исправить?

economist

#7
Разбираться с чужим кодом лень, проще свой написать. Из всех путей надо выбирать простой, но перспективный.
Сначала в консоли в папке 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

economist

Win+R
cmd
cd "C:\Program Files\LibreOffice\program\"
python -m pip install pyautogui
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Цитата: 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
который я не до конца понимаю - он из разряда, одни люди сделали, чтобы другие мучились....

economist

#13
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 Так что выбрать есть из чего.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Цитата: Ципихович Эндрю от 12 января 2024, 14:34ну и совет:
ЦитироватьWin+R
cmd
cd "C:\Program Files\LibreOffice\program\"
python -m pip install pyautogui
который я не до конца понимаю - он из разряда, одни люди сделали, чтобы другие мучились....

Построчно, жмем клавиши Win+R, копируем команды ниже построчно и жмем Enter, они выполняются, смотрим на вывод, нет ли ошибок, идем ниже. В результате получаем установленную либу в LO-Python
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...