質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

876閲覧

PyQt5 GUIが起動するまでのプログレスバー起動

goki_gottan

総合スコア168

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/07/29 07:09

編集2022/08/01 00:14

Python3でPyQt5を使用して、GUIを作成しております。
メインウインドウの起動に時間がかかるため、起動前にプログレスバーを設けようと思っておりますが、うまくいきません。

プロセスとして、
①メイン起動の前準備のため、データを読み取る・・・ex = window() に当たる
②ex.show()までに時間がかかるため、updata1関数にプログレスバーを設ける
③exshow起動時には、プログレスバーのあるrootウインドウを消したい

from PyQt5.QtWidgets import QApplication,QDialog from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout,QCheckBox,QHBoxLayout,QPushButton,QLabel,QLineEdit,QGridLayout from PyQt5.QtGui import QIcon from PyQt5 import QtGui from PyQt5.QtCore import pyqtSlot from PyQt5 import QtCore import sys from PyQt5.QtWidgets import QMessageBox from PyQt5.QtGui import QPixmap import numpy as np import os,glob,io def updata1(): global app,pro_g_bar for a in range(10):**ボールドテキスト** value = pro_g_bar.value() pro_g_bar.setValue(value + 10) QTest.qWait(1000) if value == 100: root.close() break return def main_3(): app1 = QtWidgets.QApplication(sys.argv) ex = window() ex.show() def update(): global root,app,pro_g_bar thread2=threading.Thread(target=updata1(root)) thread2.start() thread4=threading.Thread(target=updata1()) thread4.start() def reset(): global root,app,pro_g_bar value = 0 pro_g_bar.setValue(value) def main_1(): global app,pro_g_bar app = QApplication(sys.argv) root = QWidget() root.resize(300,300) root.setWindowTitle('こんにちは、世界') pro_g_bar = QtWidgets.QProgressBar(root) pro_g_bar.setGeometry(50,50,250,30) pro_g_bar.setValue(0) update_button = QtWidgets.QPushButton(root) update_button.setText("更新ボタン") update_button.clicked.connect(update) update_button.move(50,100) reset_button = QtWidgets.QPushButton(root) reset_button.setText("リセットボタン") reset_button.clicked.connect(reset) reset_button.move(50,150) root.show() sys.exit(app.exec_()) #メイン class window(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #時間のかかる長い処理 def main_2(): global app,ex,g1,v_1,num1,num2,data,conn,ff,app1,ex   #データ取得処理 thread2=threading.Thread(target=main_1()) thread2.start() return if __name__ == '__main__': main_2()

実際には、プログレスバーウインドウは消えず、メインとしたいWINDOWが落ちる。
メインwindowは起動後、ずっと継続して表示維持させたい

何卒、宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki23

2022/07/29 11:30

必要な import 文等を省略しないようにお願いします
goki_gottan

2022/08/01 00:13

以下です。編集いたします。 from PyQt5.QtWidgets import QApplication,QDialog from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QAction, QTableWidget,QTableWidgetItem,QVBoxLayout,QCheckBox,QHBoxLayout,QPushButton,QLabel,QLineEdit,QGridLayout from PyQt5.QtGui import QIcon from PyQt5 import QtGui from PyQt5.QtCore import pyqtSlot from PyQt5 import QtCore import sys from PyQt5.QtWidgets import QMessageBox from PyQt5.QtGui import QPixmap import numpy as np import os,glob,io
guest

回答1

0

Thread(target=main_1()

正しいスレッドの使い方になってません、引数として渡す前に main_1 関数を呼び出しています。
但し、問題はこの部分修正ではなく、スレッドを利用するプログラムの設計から見直しが必要です。

マルチスレッドでのGUIアプリケーションでは、前提として
QApplication は必ずメインスレッドで作成し、app.exec や他のGUI関連のメソッドも
メインスレッドから呼び出すようにします。

サブスレッドでは GUI に依存しない時間のかかる処理を行います。
重要なのは、サブスレッド側で直接 GUI を操作してはいけません。
(Qt では出来ないはずです。他の GUI でも出来たとしても不具合の原因になります)

サブスレッドでの進捗によりプログレスバーを稼働させたい場合は、
サブスレッド ⇛ メインスレッドへのスレッド間通信を行います。

手段はいくつかあり、

  • Python の threading.Thread を利用する方法。⇛ Queue 等を用いてメインスレッド側へ通知
  • PyQt の QThread を利用する方法 ⇛ Qt のシグナル・スロットの枠組が使える

 ※ QThread の使い方は2通りあり、Web 上の情報では混同されがちなので注意が必要です。
この場合は、QThread をサブクラス化しない・moveToThreadを使う方法を調べてください。
サブクラス化する実装方法では、スレッド間でのシグナル・スロットが正常に働きません。

投稿2022/08/14 04:56

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問