Senin, 04 September 2023

qtreadpyqt

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QPushButton, QVBoxLayout, QProgressBar from PyQt5.QtCore import QThread, QObject, pyqtSignal as Signal, pyqtSlot as Slot import time #The Worker class has two signals: #mewarisi dari sinyal qobjek #progress #completed #Kelas Pekerja akan memancarkan sinyal kemajuan #ketika sebagian pekerjaan telah #selesai dan sinyal selesai ketika pekerjaan telah selesai. class Worker(QObject): progress = Signal(int) completed = Signal(int) #Metode do_work() memiliki dekorator @Slot() (atau pyqtSlot). Dekorator @Slot() mengubah metode do_work() menjadi slot. #Dekorator @Slot() bersifat opsional. Namun, menghubungkan sinyal ke metode Python yang dihias dapat membantu mengurangi penggunaan memori dan membuatnya sedikit lebih cepat. #Metode do_work() menerima bilangan bulat. Ini mengulangi rentang mulai dari 1 hingga argumen. Dalam setiap iterasi, ia berhenti selama satu detik menggunakan time.sleep() dan memancarkan sinyal kemajuan dengan nilai saat ini menggunakan metode emit(). #Setelah selesai, metode do_work() memancarkan sinyal selesai dengan nilai nilai integer terakhir. #Berkomunikasi antara thread utama dan thread pekerja @Slot(int) def do_work(self): print ("halo") n=3 for i in range(1, n+1): time.sleep(1) self.progress.emit(5)#mengembalikan nilai v self.completed.emit(i)# mengembalikan nilai int v class MainWindow(QMainWindow): #First, create a signal in the MainWindow class: work_requested = Signal(int) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setGeometry(100, 100, 300, 50) self.setWindowTitle('QThread Demo') # setup widget self.widget = QWidget() layout = QVBoxLayout() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.progress_bar = QProgressBar(self) self.progress_bar.setValue(0) self.btn_start = QPushButton('Start', clicked=self.start) layout.addWidget(self.progress_bar) layout.addWidget(self.btn_start) #Second, create a Worker object and worker thread: self.worker = Worker() self.worker_thread = QThread() #Third, connect the progress and completed signal of the worker object with the methods of the main window: self.worker.progress.connect(self.update_progress)#jika terdapat sinyal progres akan dijalnkan f update progres self.worker.completed.connect(self.complete) #Fourth, connect the work_requested signal of the MainWindow with the do_work method of the worker object: self.work_requested.connect(self.worker.do_work)#konek kedalam funsi dowork self.work_requested.emit(2)#menjalankan tread 2x #Fifth, move the worker to the worker thread by calling the moveToThread() method: # move worker to the worker thread self.worker.moveToThread(self.worker_thread) #Finally, start the worker thread: # start the thread self.worker_thread.start() # show the window self.show() def start(self): #self.btn_start.setEnabled(False) n =100 self.progress_bar.setMaximum(n) self.work_requested.emit(2)#menjalankan tread 2x pengganti do work funsi diclass worker def update_progress(self, v):#nilai v diambil dari emit signal progres self.progress_bar.setValue(v) def complete(self, v): self.progress_bar.setValue(v) self.btn_start.setEnabled(True) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() sys.exit(app.exec())