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

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

02.08.2021, 22:49. Показов 2408. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru