Pyqt uygulamamda QProgressDialog kullanarak bir meşgul göstergesi oluşturmak istiyorum. Yani arka planda main thread de kod yürütülürken ve bir takım işlemler yapılırken kullanıcı bilgilendirmesi için ekranda gözüksün.
sorun şu ki min ve max değerilerini sıfır yaparak şu şekilde oluşturdukran sonra
self.progressPreview = Progress("İşlem bilgisi", "İşleniyor...", 0, 0, self)
barın gözükmesi için bir olay döngüsü istiyor. işlemlerin başında ve sonunda yayılması için iki sinyal oluşturdum ama bu sinyalleri kullanarak içine soktuğum olay döngüsünü kıramıyorum. Program main thread üzerinden akıyor galiba.
def createProgressDialog(self): # işleme başlandığı an QProgressDialog oluşturur.
self.progressPreview = Progress("İşlem bilgisi", "İşleniyor...", 0, 0, self) # QProgressDialog oluşturur
self.isProcess = True # olay döngüsü işleme bool
self.workThread = WorkThread(self.busyIndicator(self.isProcess)) # olay döngüsü bir thread e gönderiliyor
self.workThread.start() # QThread başlat
print("QProgressDialog oluştu...")
def busyIndicator(self,isProcess): # QProgressDialog olay döngüsü. bitirme sinyali yayılınca döngüden çıkılmalı
while True:
if isProcess:
QApplication.processEvents() # olay dönüsü yenileme
else:
break
def finishProgressDialog(self): # bitirme sinyali bu metodu çalıştırır.
self.busyIndicator(False) # olay dönüsü bitir
self.workThread.terminate() # thread sonlandır.
self.progressPreview.close() # QProgressDialog pencere kapat
print("QProgressDialog sonlandı.")
görüleceği gibi QThread e busyIndicator metodunu geçirmek ve bunu run fonksiyonu üzerinde çalıştırmak istiyorum ama olmuyor
from PyQt5.QtCore import QThread
class WorkThread(QThread):
def __int__(self,work): # work metodu yapıcıya iletildi.
super(WorkThread, self).__int__()
self.work = work()
def run(self) -> None:
try:
print("run çalıştı")
self.work() # çalıştırılacak metod
except Exception as e:
print(e)
oluşturduğum thread sınıfının çalışmadığını da gözlemliyorum. Yabancı forumlarda QThread ile çalışırken sinyal ve yuva şeklinde ayarlayın demişler ama bu sinyal işini nasıl kuracağımı da bilmiyorum.
başka bir yol olarak
loop = QEventLoop(self)
QTimer.singleShot(1000, loop.quit)
loop.exec_()
denedim başka bir yerde yüzdelik bar olarak. Çalıştı. Bir for döngüsü içindeydi. bu olay döngüsü için yeterli oldu. Ama aynı şeyi meşgul göstergesi için yapınca haliyle singleShot 1 sn sonra olay döngüsüü kırdı çünkü for döngüsü içinde değildi. Bende loop.quit yuvasını harici bir sinyal bağlamam gerektiğini düşündüm ama tabi kodun main thread üzerinden akışına devam etmesi ve bu işin harici bir thread üzerinden yapılması gerektiği noktasına geldim. Bir şekilde yapılan işlerin sonuna geldiğinde bitirme sinyali yayılmalı ve önce olay döngüsü kırılmalı, sonra thread sonra da pencere kapanmalı.
kafamdakini ifade eden bir diyagram bu şekildedir.
vakit ayırıp zihin mesaisi yapacaklara şimdiden müteşekkirim.