Путевые заметки в процессе познания Python и PyQt/PySide.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
Помни - только тег CODE не портит код добавлением пробела в начало пустой строки.
К вопросу об экранной заставке при старте PyQt-приложений
Запись от iamvic размещена 10.10.2021 в 23:19
Показов 7183
Комментарии 20
|
Однако, появилась ещё одна тема для памятки, поскольку неожиданные (хотя и прогнозируемые) трудности вызвала организация показа экранной заставки при старте PyQt-приложений под Linux. Принцип-то понятен. А если не забывать, что Python - это интерпретатор и в процессе загрузки приложения может тратить значительное время на предварительную трансляцию самописных модулей и помещение результатов в рабочий каталог __pycache__, то, наверное, приемлемое решение могло бы выглядеть так: splash_probe.py:
и событие showEvent уже произошло, и self.isVisible() возвращает True, а окно-то всё ещё не отрисовано (см. https://www.cyberforum.ru/blog... g6887.html) Именно задержка X11 в отрисовке окон и не даёт нормально развернуться экранной заставке. А поскольку с подобным поведением уже боролся, то и решение-то получилось довольно простое: (PS: Первоначальное решение убрано под кат ради сохранения полноты дискуссии) Кликните здесь для просмотра всего текста
splash_probe.py:
(PS: Ниже приведено окончательное решение) splash_probe.py:
| |||||||||||||||
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 20
Комментарии
-
Запись от Avazart размещена 11.10.2021 в 12:55
-
Спасибо, Avazart!
Сами понимаете - мера вынужденная. Всё нагугленное выглядело уж слишком устрашающим
Сообщение от Avazart
.
Вы правы. Действительно, Ваше предложение использовать app.exec() и отправлять сигнал на слот app.quit выглядит предпочтительным:
Сообщение от Avazart
Попутно выяснилось, что и задержку отправки сигнала всё-таки надо увеличить, иначе тяжёлые картинки не успевают загрузиться.Python 1 2 3 4 5
if sys.platform == 'win32': app.processEvents() else: QTimer.singleShot(500, app.quit) app.exec()
Вот так, с налёту, не могу ухватить смысл этого предложения. Растолкуете? Можно даже примером кода - в этот-то раз я не стал в архив паковать
Сообщение от Avazart
.Запись от iamvic размещена 12.10.2021 в 08:13
-
Запись от Avazart размещена 12.10.2021 в 12:29
-
Запись от Avazart размещена 12.10.2021 в 12:31
-
Не качаю. Никак. Ничем.
Картинка просто лежит в текущем каталоге диска. Большая при первом запуске, пока Linux воюет с кэшем, не успевает отобразиться в той прокрутке цикла событий, которую Вы назвали лишней, а маленькая успевает. При повторном же пуске успевают и большая, и маленькая.Python 1
splash = QSplashScreen(QPixmap('splash_image.jpg'))
Запись от iamvic размещена 12.10.2021 в 14:42
-
Запись от Avazart размещена 12.10.2021 в 14:57
-
Картинка-то простая, а вот железка с собой в поездку взята слабенькая. Вот и вылазят разные интересности.
Простите, но пока пропаду со связи.Запись от iamvic размещена 12.10.2021 в 15:21
-
Запись от Avazart размещена 12.10.2021 в 18:11
-
Запись от Avazart размещена 12.10.2021 в 19:24
-
Вопрос, конечно, философский... Отвечу развёрнуто.
Не секрет, что общеизвестные правила хорошего тона рекомендуют после старта приложения вывесить некую заставку на экран, чтобы пользователь был уверен, что приложение всё-таки запустилось по двойному щелчку ЛКМ. Разработчики Qt предлагают использовать для этих целей QSplashScreen. Описанный в документации Qt классический способ прекрасно работает под Windows и абсолютно недееспобен под Linux. Возникшая необходимость обеспечения одинаковой функциональности приложения под разными ОС и привела к вышеуказанному решению, которое с минимальными затратами со стороны программиста решает поставленную задачу. Судя по результатам предварительных испытаний, способ рабочий. Вот и всё.Запись от iamvic размещена 14.10.2021 в 23:17
-
А я бы сказал это правила плохого тона. Зачем пользователя заставлять ждать? Это ожидание явно радует пользователя.
Когда Вы запускаете QtCreator Вы видите заставку?
Как я сказал заставка это костыль призванный скрыть долгую загрузку приложения.
Т.е. пока показывается заставка основная программа в это время грузит модули сканирует файлы качает файлы с сети открывает соединение с БД или еще что либо что требует много времени.
Лично я бы даже в таких случаях не делал бы заставку. По крайней мере не показывал бы ее одну.
В таких случаях можно показать главное окно а уже поверх него заставку или же вместо заставки показывать прогрессбар в основном окне. Так явно лучше чем заставка перекрывающая все и вся и которую не закрыть ни свернуть.Запись от Avazart размещена 15.10.2021 в 13:29
-
Уважаемый, Avazart! Да, я даже соглашусь со всеми Вашими оценками
. Только поймите правильно, что моя задача в данной конкретной ситуации состояла не в том, чтоб оценочки выставлять людям и технологиям, а найти приемлемый выход при существующем положении дел. Вот в чём беда. Кто там, что там и как будет делать дальше - мне, как Вы понимаете, доложить забыли. 
Запись от iamvic размещена 15.10.2021 в 17:46
-
Выход только один перестать биться головой об стену и начать использовать ее по назначению т.е думать.
Проблема XYЗапись от Avazart размещена 15.10.2021 в 18:18
-
Avazart, это всё прекрасно, но очнитесь! Мы как-то всё о разных вещах толкуем. Вы ж не знаете всех обстоятельств, приведших к появлению этой заплатки. Мы живём в несовершенном мире. Когда у людей пожар-цейтнот-аврал и всё пропало, не время рассуждать о качестве проекта, надо пластырь заводить, разбираться на берегу будут.
Ведь, все с Вами согласны, что изначально всё надо было делать по-другому. Наверное, примерно так, как я предлагал здесь https://www.cyberforum.ru/pyth... 45300.html Пусть это коряво, наивно, избыточно и вызывает у вас рвоту, но моделька всё же даёт представление о том, как можно это всё реализовать. Можно спорить, дискутировать, критиковать, но так или иначе решение проблемы существует.
Но вписаться с этим в уже готовый горящий проект не представляется возможным. Что выберете в этой ситуации - добавить несколько строк и выжить или утонуть в объёмных переделках? По головам-то бить и руки выпрямлять имеет смысл только выжившим... По пластырю замечания есть?
Запись от iamvic размещена 16.10.2021 в 09:31
-
Запись от Avazart размещена 16.10.2021 в 19:20
-
Ну дык-ть живём-то по сказке, куда из неё денешься-то: один - изъявляет желание "Хочу ковёр-самолёт", другой - проектирует, третий - исполняет, четвёртый - пилотирует, а когда начинают падать - зовут пятого "Делай, что хочешь, но чтоб летело - жить хотим!!!", пятый - забивает костыль и, обеспечив мягкую посадку, получает заслуженное вознаграждение
. Тут и сказочке - конец.Запись от iamvic размещена 16.10.2021 в 20:50
-
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
import sys from PyQt5.QtCore import Qt, QEventLoop, QTimer from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import QApplication, QMainWindow, QSplashScreen def main(): app = QApplication(sys.argv) splash = QSplashScreen() splash.showMessage('Загрузка данных...', Qt.AlignHCenter | Qt.AlignBottom, Qt.red) splash.show() w = QMainWindow() def timeout(): splash.finish(w) w.show() QTimer.singleShot(1000, timeout) sys.exit(app.exec()) if __name__ == '__main__': main()
Запись от Avazart размещена 18.10.2021 в 13:56
-
Спасибо! Дискуссия могла быть намного короче... Занёс в мемориз 
Запись от iamvic размещена 18.10.2021 в 16:56
-
Запись от Avazart размещена 18.10.2021 в 21:27
-
Ну, недопёр... Бывает.Запись от iamvic размещена 18.10.2021 в 22:23

.

Спасибо! Дискуссия могла быть намного короче... Занёс в мемориз 

