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())
Langganan:
Postingan (Atom)