Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 01.03.2020
Сообщений: 12
PyQt5

Отображение главного окна программы | QThread

02.08.2021, 22:49. Показов 2415. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пишу GUI на Python. Использую библиотеку PyQt5. Написал свой SplashScreen с целью отвлекания пользователя во время загрузки программы. Чтобы во время показа программа грузилась, использую QThread. Но после показа splashScreen не удаётся показать главное окно программы
Python
1
MainWindow.show() # Показ главного окна
Возможно, рабочий поток не знает о MainWindow? Поможет ли moveToThread?
Код привожу ниже
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class mainUI(Ui_MainWindow, Tab1Action, Tab2Action):
    def preInit(self):
        resolution = QtWidgets.QDesktopWidget().screenGeometry()
        x_center = int(resolution.width() / 2 - lb.frameSize().width()/2)
        y_center = int(resolution.height() / 2 - lb.frameSize().height()/2)
 
        an = Animation().animation(lb, x_center, y_center, MainWindow)
        an.start()
        lb.show()
 
    def init(self):
        # Некоторые инициализирующие действия...
        time.sleep(3)
        lb.close()
 
    def onFinish(self):
        print("show window") # Тут выводится текст в консоль, но следующая строка абсолютно ничего не делает
        MainWindow.show()
 
class OwnThread(QtCore.QThread):
    def __init__(self, parent = None):
        super(OwnThread, self).__init__(parent)
 
    def run(self):
        ui.init()
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = mainUI()
    
    lb = SplashScreen().create()
    
    ui.preInit()
    ui.setupUi(MainWindow)
 
    myThread = OwnThread()
    myThread.finished.connect(ui.onFinish)
    myThread.start()
    sys.exit(app.exec_())
Ещё хотелось узнать можно ли как-то также в рабочий поток передать строку с инициализацией дизайна
Python
1
ui.setupUi(MainWindow) #Инициализация дизайна программы
Я пробовал, но получал ошибки, а ведь в главном потоке эта команда также занимает некоторое время.
Спасибо за уделённое время
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2021, 22:49
Ответы с готовыми решениями:

Дублирование главного окна при открытии нового окна
У меня есть основное окно типа QWidget, при нажатии на кнопку открывается окно типа QDialog. Но вместе с диалоговым окном открывается и...

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

Получить заголовок главного окна программы, по её pID
Всем доброго времени суток, помогите пожалуйста из получить заголовок главного окна программы, по её pID #include...

3
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
03.08.2021, 08:25
Цитата Сообщение от Hanler Посмотреть сообщение
Возможно, рабочий поток не знает о MainWindow?
Мало того, в документации Qt явно говорится, что GUI исполняется исключительно в главном потоке, иначе называемом GUI-потоком.
3
0 / 0 / 0
Регистрация: 01.03.2020
Сообщений: 12
03.08.2021, 08:53  [ТС]
То есть, в данном случае главное окно программы возможно отобразить только в том же потоке, что и splashScreen? Получается, что splashScreen немного тогда бесполезен, ведь программа всё равно начнёт грузиться после него?
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
03.08.2021, 10:42
Там всё-таки не совсем так плохо. Если учитывать, что Python - интерпретатор, то можно добиться более-менее адекватных результатов. Если взять пример отсюда https://doc.qt.io/qtforpython/... creen.html , то я бы вынес всё связанное с главным окном в отдельный файл, например, написал бы свой подкласс MyMainWindow(QMainWindow) и положил бы его в файл mymainwindow.py, а импорт из него расположил бы так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
if __name__ == "__main__":
 
    app = QApplication([])
    pixmap = QPixmap(":/splash.png")
    splash = QSplashScreen(pixmap)
    splash.show()
    app.processEvents()
    ...
    from mymainwindow import *
    window = MyMainWindow()
    window.show()
    splash.finish(window)
    sys.exit(app.exec())
потому как интерпретатор начнёт предварительную трансляцию и запихивание оттранслированного модуля типа *.pyt в каталог __pycache__ уже после показа splashscreen. А процесс этот может быть достаточно долгим, поскольку там по цепочке и все остальные модули подхватываются. Вот примерно так...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.08.2021, 10:42
Помогаю со студенческими работами здесь

Сохранение списка в обработчике закрытия главного окна программы
Определен обработчик закрытия окна - g_signal_connect (G_OBJECT (d.window), "destroy", G_CALLBACK(gtk_main_quit), NULL); ...

Вылет программы при попытке создания главного и дочернего окна
Подскажите пожалуйста, что я сделала не так? Запускается и вылетает. А должно создаваться два окна:основное и дочернее. #include...

Foreground service, context null после закрытия главного окна программы
Есть Foreground service который создает Notifiction в statusbar, я его запускаю, и потом запускаю таймер который просто каждых 2 секунды...

Как при закрытии главного окна программы, закрыть все другие?
Как при закрытии главного окна программы, закрыть все другие? Есть три класса Window1, Window2 и Window3, как при закрытии окна Window1...

Как мне сослаться на вторичные окна (формы) из главного окна
Мне скинули код.....я пытаюсь коды этих отдельных форм просмотреть в конструкторе.......то есть создав новый проект.......но наткнувшись на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru