Уведомления

Группа в Telegram: @pythonsu

#1 Май 21, 2022 15:33:59

Novator
Зарегистрирован: 2021-03-22
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

self.txt_console - текстовое поле на форме qt

Офлайн

#2 Май 22, 2022 00:45:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

Novator
но через print в консоль все выводится красиво и постепенно, а вот в текстовое поле - рывком и все сразу
Что выводится в консоль и как?
Что выводится в текстовое поле?
Что должно быть? Что должно выводиться в текстовое поле и как?



Офлайн

#3 Май 22, 2022 07:27:27

Novator
Зарегистрирован: 2021-03-22
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

Ну если в этом отрезке кода заменить SetPlainText() на print:

 for book in sel_book:
                book = self.path['Fb2In'] + '/' + book
                p = subprocess.Popen([self.path['Converter'], '-c', self.path['ConverterIni'], 'convert', '--to',
                                      'mobi', book, self.path['MobiOut'], '--ow'], stdout=subprocess.PIPE)
                result = p.communicate()[0].decode('UTF-8')
                print(result)
То лог выводится постепенно на каждом шаге цикла. А если писать так:
 for book in sel_book:
                logtext = self.txt_console.toPlainText()
                book = self.path['Fb2In'] + '/' + book
                p = subprocess.Popen([self.path['Converter'], '-c', self.path['ConverterIni'], 'convert', '--to',
                                      'mobi', book, self.path['MobiOut'], '--ow'], stdout=subprocess.PIPE)
                result = p.communicate()[0].decode('UTF-8')
                self.txt_console.setPlainText(logtext + result)
То выводится весь лог по окончанию работы программы

Офлайн

#4 Май 22, 2022 09:21:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

Novator
То выводится весь лог по окончанию работы программы
Тебе нужно добавить сигнал и подключить его к слоту. Это если коротко.

И вообще программу надо сделать многопоточной внутри Qt, чтобы не было блокировок. Не думаю, что ты справишься с этим, ничего не зная про Qt и воспринимая его в розовых тонах в плане “ой, мне кажется он такой простой, этот Qt” и “мне кажется, я понял, как он работает, всё просто”.

Просто почитай нечто приблизительное
https://stackoverflow.com/questions/36434706/pyqt-proper-use-of-emit-and-pyqtsignal
Без подготовки туда лучше не лезть.



Офлайн

#5 Май 22, 2022 16:29:30

Novator
Зарегистрирован: 2021-03-22
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

py.user.next, а по твоему, надо писать батник типа:

 echo Привет мир!
или офигевать как python раскидывает список по переменным в коде:
 a, b. *c, d = [1, 2, 3, 4, 5, 6]
Знаешь, не ошибается только тот, кто ничего не делает

Офлайн

#6 Май 22, 2022 22:14:40

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1359
Репутация: +  119  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

Novator
То выводится весь лог по окончанию работы программы
Работа окна - это цикл, в котором последовательно прорисовывается все что на нем есть, т.е в конце прорисовки, вызывается метод обновления окна, который перебрасывает в начало прорисовки и так по кругу.

И вот в этом цикле, после нажатия кнопки у тебя запускается еще один цикл, т.е прорисовка прекращается, работает твой цикл, который получает данные, и пока этот цикл не кончится, метод обновления окна не вызовется,т.к он в конце основного цикла.

Поэтому тебе нужно цикл получения данных запустить параллельно основному циклу, и каждую порцию данных отправлять в основной поток в метод вставки текстовых данных.

thread,чтобы запустить в отдельном потоке, QtCore.pyqtSignal(str) чтобы отправить сигнал с данными в основной поток

Офлайн

#7 Май 23, 2022 01:26:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

Novator
py.user.next, а по твоему, надо писать батник типа:
 echo Привет мир!
Не, я написал эту программу, которая тебе нужна, у себя в голове от и до и увидел, что она такая сложная, что ты даже приблизительно не поймёшь, как её сделать. А за тебя я её писать не буду, мне-то она нафиг не нужна. Мне есть что писать. У меня этих программ десятки и я их все пишу дальше, поднимая версии.

Вчера вот скрипт написал, который разделяет браузеры в операционной системе. Один браузер под WhatsApp на компе выделил, а другим браузером пользуюсь постоянно для инета. Так вот эти браузеры через шину общаются. Если один открыт, то когда другой запускаешь, он через шину понимает, что другой браузер открыт и посылает ему сообщение “открой окно у себя”, а сам не запускается. А браузеры вообще разные. У одного одни расширения стоят, у другого другие расширения стоят. Один можно обновлять, другой нельзя обновлять. У одного настройка загрузок такая, у другого настройка загрузок другая. Там всё разделено. А они вот общаются через шину, потому что разработчики думали, что браузер может быть один в системе и только для просмотра Интернета. Пришлось это всё разделять самому.

Вот такой скрипт получился у меня
[guest@localhost ~]$ cat /usr/local/bin/ffrunner.sh 
#!/bin/bash

# This script runs Firefox

progname=`basename $0`

# Print an error message to stderr
# error(str)
error()
{
echo "error: $progname: $1" >&2
}

# Print a message to stdout
# msg(str)
msg()
{
echo "$progname: $1"
}

# Print program usage to stderr
# usage()
usage()
{
{
echo -n "usage: $progname "
echo -n "{ run | runurl } "
echo -n "configfile "
echo -n "[ url ]"
echo
} >&2
}

configfile_get_watch_path()
{
local config_file=$1
local text

text=$(cat "$config_file")
echo -n "$text"
}

run_check_config()
{
local config_file=$1
local watch_path

watch_path=$(configfile_get_watch_path "$config_file")
if [ -e "$watch_path" ]; then
msg "Watch path found: $watch_path"
firefox --new-instance
else
msg "Watch path not found: $watch_path"
firefox
fi
}

run_check_config_url()
{
local config_file=$1
local url=$2
local watch_path

watch_path=$(configfile_get_watch_path "$config_file")
if [ -e "$watch_path" ]; then
msg "Watch path found: $watch_path"
firefox --new-instance "$url"
else
msg "Watch path not found: $watch_path"
firefox "$url"
fi
}

main()
{
local command
local config_file
local url

case $# in
0|1)
usage
return 1
;;
2)
command=$1
config_file=$2
[ "$command" = "run" ] && \
run_check_config "$config_file" && \
return 0
return 1
;;
3)
command=$1
config_file=$2
url=$3
[ "$command" = "runurl" ] && \
run_check_config_url "$config_file" "$url" && \
return 0
return 1
;;
*)
error "unknown arglist: "$*""
return 1
;;
esac
}

main "$@" || exit 1

exit 0
[guest@localhost ~]$
Потом к ярлыкам браузера в графической оболочке операционной системы он прикрепляется как команда.
Вот это простенький скрипт, писал я его минут пятнадцать. Это не первый скрипт, который я пишу, поэтому у меня со старых и последних моих скриптов сохранился шаблон и я его просто заполнил и дополнил парой функций. А ты его поймёшь? Как он организован вообще? В чём ключевой алгоритм заключается?

А в системе потом просто запускаешь его
[guest@localhost ~]$ ffrunner.sh 
usage: ffrunner.sh { run | runurl } configfile [ url ]
[guest@localhost ~]$
И он говорит “запускай меня вот так вот”.
Всё, проблема решена. Теперь эти браузеры разделены у меня. Браузер, в котором WhatsApp открывается, накапливает свою информацию. Браузер, в котором я в Интернете сижу, накапливает свою информацию. И они не пересекаются никак. Этот скрипт их так разделяет, что через шину может общаться только тот браузер сам с собой, через который я в Интернете сижу.

Так что программисту всегда есть что писать. Я себе написал, у меня теперь всё работает. Я ни у кого не ходил и не спрашивал “а дайте мне вот какую-то хуйню, чтобы у меня всё работало”. Я просто взял и написал себе сам.

Novator
надо писать батник типа
Батник? А что это? А, это такая фигня в виндоус, которая из доса пришла. Дорогуша, я в винудоус был, может, месяцев восемь назад. У меня эта система стоит только для игр каких-то там, которые в Linux'е не запускаются. Я ею уже давно не пользуюсь, лет десять.

Так что вердикт вот такой: без многопоточности она у тебя будет висеть в блокировке и ты не сможешь получать эти фрагменты вовремя, а чтобы многопоточным сделать приложение на Qt, надо перелопатить кучу материала, потому что многопоточность в Qt делается через жопу. Я разобрался в своё время с этой хуйнёй и сделал себе многопоточный сканер спокойно. Теперь он фурычит, теперь ничего не висит, все кнопки нажимаются в любое время (раньше её нажимаешь и она нажатой висит, пока не завершится подпроцесс, который там хрен знает сколько работает). Но пришлось мне для этого изучить дохера всего. Ты не изучил от этого даже одной крупицы. Это всё видно, как на ладони, по твоему коду, который ты выложил. Поэтому я тебе и говорю, что ты не вывезешь, будешь у нас тут спрашивать “а как мне делать дальше?”. И так у меня возникает вопрос “а нужно ли мне этому гаврику, который нихера не знает, писать ещё программу эту всю, разжёвывать ему и в ротик класть каждую строчку, как птенчику этому желторотому тупому, который может только ротик открывать и ждать червячка?”. Конечно же, мне это не улыбается. Я лучше время на что-нибудь другое потрачу, у меня хватает дел.



Отредактировано py.user.next (Май 23, 2022 01:35:04)

Офлайн

#8 Май 23, 2022 07:12:23

Novator
Зарегистрирован: 2021-03-22
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск внешней программы с параметрами

py.user.next, не буду говорить, какой ты умный - ты и сам знаеь
А вот у меня на винде браузеры и так отдельно работают без проблем.
Один совет все же дам - не пиши ничего в моих темах, если, конечно, я еще сюда загляну… Такое ощущение, что ты один на форуме
Разберусь без… в смысле - сам, а не разберусь - значит, скажу, что мне это было не надо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version