Python PyQt5线程don'

2024-09-28 21:56:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个进度条,显示(如忙),直到按钮的代码结束。我的目标是在按下按钮(连接到函数)时显示进度条,在代码运行时保持可见,并在连接到按钮的函数时隐藏它结束。这个任务部分完成,但我的进度栏setVisible(True)等待代码结束,它们显示。 我的代码在这里:

from ui import Ui_MainWindow
from PyQt5 import QtCore, QtGui, QtWidgets, QtPrintSupport
from PyQt5.QtWidgets import QDialog,QWidget,QApplication, QInputDialog, QLineEdit, QFileDialog
from PyQt5.QtGui import QIcon

class ProgressThread(QtCore.QThread):
    job_done = QtCore.pyqtSignal('QString')
    def __init__(self, parent=None):
        super(ProgressThread, self).__init__(parent)
        self.gui_bar = None
    def do_work(self):
        self.job_done.emit(self.gui_bar)

    def run(self):
        self.do_work()

class mainProgram(QtWidgets.QMainWindow, Ui_MainWindow):                   #main window
    def __init__(self, parent=None):
        super(mainProgram, self).__init__(parent)
        self.setupUi(self)

        self.progress_thread = ProgressThread()
        self.progress_thread.job_done.connect(self.on_job_start)
        self.create_ui()

        self.B_aerodrome_data.clicked.connect(self.start_thread)

        self.B_aerodrome_data.clicked.connect(self.aerodrome_data)


    def aerodrome_data(self):          #def i want with start show progress bar
        #here show progressBar(self.progress.setVisible(True) and update gui)
        #do many staffs of code here that takes time

        #here hide progress bar and update gui 

    def start_thread(self):
        self.progress_thread.gui_bar = self.progress.setVisible(False)
        self.progress_thread.start()

    def on_job_done(self):
        print("Generated string : ")
        self.progress.setVisible(False)


    def on_job_start(self):
        print("aaaaaaaaaa")
        self.progress.setRange(0,0)
        self.progress.setVisible(True)
    def create_ui(self):
        self.progress = QtWidgets.QProgressBar(self)
        self.progress.setVisible(False)
        self.progress.setGeometry(200, 205, 250, 20)
        self.progress.setRange(0, 0)
        self.progress.setObjectName("progress")
        #self.button.clicked.connect(self.start_thread)
        layout = QtWidgets.QVBoxLayout(self)
        #layout.addWidget(self.button)

if __name__ == "__main__":                       
    app = QtWidgets.QApplication(sys.argv)
    nextGui = mainProgram()
    nextGui.showMaximized()
    sys.exit(app.exec_()) 

Ui\u Main窗口在这里:

^{pr2}$

Tags: fromimportselfinitdefbarjobgui
2条回答

在您的例子中,我看到您创建了不必要的函数,我删除了一些。根据你告诉我的,信号不需要携带信息,所以我将创建一个没有参数的信号。连接到按钮的插槽必须使QProgressBar可见并启动线程,并且完成的信号作业必须与隐藏QProgressBar的方法连接,在下面的示例中使用QThread::sleep()来模拟某些处理。在

class ProgressThread(QtCore.QThread):
    job_done = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(ProgressThread, self).__init__(parent)

    def do_work(self):
        QtCore.QThread.sleep(2) # emulate processing
        self.job_done.emit()

    def run(self):
        self.do_work()


class mainProgram(QtWidgets.QMainWindow, Ui_MainWindow):  # main window
    def __init__(self, parent=None):
        super(mainProgram, self).__init__(parent)
        self.setupUi(self)

        self.progress_thread = ProgressThread()
        self.progress_thread.job_done.connect(self.on_job_done)
        self.create_ui()
        self.B_aerodrome_data.clicked.connect(self.aerodrome_data)

    def aerodrome_data(self):
        self.start_thread()

    def start_thread(self):
        self.progress.setVisible(True)
        self.progress_thread.start()

    def on_job_done(self):
        print("Generated string : ")
        self.progress.setVisible(False)

    def create_ui(self):
        [...]

试试这个代码,你会从这里找到你的解决方案。 当你按下按钮时,线程将启动并从0-100向进度条发送int数据

from PyQt5.QtWidgets import QMainWindow,QWidget,QApplication,QVBoxLayout,QPushButton,QProgressBar
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt,QThread,pyqtSignal
import time
import sys

class THREAD(QThread): # QThread is use for parallal execution

    EMIT=pyqtSignal(int)

    def run(self):
        count=0

        while count<=100:
            count+=1
            self.EMIT.emit(count)
            time.sleep(0.1)


class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.ICON="icon.jpg"
        self.TITLE="ROBO Science LAB"
        self.TOP = 100
        self.LEFT = 100
        self.WIDTH = 700
        self.HEIGHT = 500

        self.InitWindow()
        self.setCentralWidget(ComponentManagement())
        self.show()

    def InitWindow(self):
        self.setWindowIcon(QIcon(self.ICON))
        self.setWindowTitle(self.TITLE)
        self.setGeometry(self.TOP,self.LEFT,self.WIDTH,self.HEIGHT)

class ComponentManagement(QWidget):
    def __init__(self):
        super().__init__()


        self.UIcomponent()


    def UIcomponent(self):
        vbox = QVBoxLayout()

        self.progress1 = QProgressBar()

        BUTTON = QPushButton("Click to start progress")
        BUTTON.setStyleSheet("background:#E67E22")
        BUTTON.clicked.connect(self.StartProgressBar)

        vbox.addWidget(self.progress1)
        vbox.addWidget(BUTTON)

        self.setLayout(vbox)

    def SetProgressValue(self, val):
        self.progress1.setValue(val)

    def StartProgressBar(self):
        self.ThredObject = THREAD()
        self.ThredObject.EMIT.connect(self.SetProgressValue)
        self.ThredObject.start()


if __name__=="__main__":
    App=QApplication(sys.argv)
    window=Window()
    sys.exit(App.exec())

相关问题 更多 >