Masa üstü uygulama üzerinde yükleniyor ekranı

Merhaba arkadaşlar tekrardan python pyqt5 kullanıyorum.

Uygulamada bir butona tıklandığında 8-9 saniye arka planda işlem yapan bir fonksiyonum var

Butona basıldığında bekleme ekranı (ayrı bir pencere olarak değil) ana uygulamanın içinde arka planı bulanıklaştırarak bir Yükleniyor… yazısı yazdırmak istiyorum yardımcı olabilirmisiniz.

Kodlarını atarsan yardımcı olmaya çalışırım.

şimdi butona bastığımda işleme alınan fonksiyon budur
`

 def readRecords():
    sayac = 8
    self.ui.recordDetail.clear()

    for i in range(8,38):
        # crc hesaplat
        input_data = f"58 0 1 16 {sayac} 0 0 0"
        print(sayac)
        dataSend = self.createCRCandData(input_data, sayac)
        sayac += 1
        self.send_message(dataSend)
        res = self.receive_message()

        if self.getAndControlCRC(res):
            print("gelen cevap: " + res)
            dataName1 = self.hexToDecimal(res.split(" ")[3])
            dataName2 = self.hexToDecimal(res.split(" ")[4])

            ## veri alma
            parameter = int(self.hexToDecimal(res.split(" ")[5]))
            #
            ## veri alma
            dataSayac = 1
            reciveData = ""
            for j in range(parameter):
                try:
                    reciveData += self.hexToDecimal(res.split(" ")[parameter + 1 + dataSayac])

                    dataSayac += 1

                except Exception as e:
                    print(e)

            self.reciveData[f'{dataName1} {dataName2}'] = f'{reciveData}'

        else:
            print("\n Veri yanlış geldi!!")


    say = 8

    for write in range(8,38):
        dataName = self.veri_dict[f'16 {say}']
        data = self.reciveData[f'16 {say}']

        say += 1

        print(say)
        self.ui.recordDetail.append(f"{dataName} : {data}")

`

butona tıkladığımda bu fonksyion arkada çalışırken ön planda örneğin şu videodaki gibi https://www.youtube.com/watch?v=mYPNHoPwIJI

ama arka planın blunıklaştırıp yapmak istiyorum bir web sitesi yüklenirken ön plnada yükleniyor sayfasını görmesi gibi

tasarım alanında biraz acemiyim fazla beceremedim

kodunun tamamını görmediğim için örnek yapa bilirim.

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QTimer

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

        self.setWindowModality(Qt.ApplicationModal)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)

        self.setFixedSize(120, 40)


        LB_loading = QLabel('loading...')
        LB_loading.setAlignment(Qt.AlignCenter)
        LB_loading.setFixedSize(self.width()-10,self.height()-10)

        font = QFont('console',9,QFont.Bold)
        font.setItalic(True)
        LB_loading.setFont(font)
        LB_loading.setStyleSheet('background: green; color:white; border: 2px solid white; border-radius: 15px;')

        vbox = QVBoxLayout()
        vbox.setContentsMargins(0,0,0,0)
        vbox.addWidget(LB_loading)

        self.setLayout(vbox)

    def move_custom(self,x,y):

        self.move( x- ( self.width() // 2 ) , y- ( self.height() // 2 ) )




class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(100, 100, 400, 300)

        self.button = QPushButton("Show Loading")
        self.button.clicked.connect(self.show_loading)

        layout = QVBoxLayout()
        layout.addWidget(self.button)

        self.main_widget = QWidget()
        self.main_widget.setLayout(layout)

        self.setCentralWidget(self.main_widget)

        self.loading_overlay = LoadingOverlay()
        self.loading_overlay.hide()




    def moveEvent(self, event):
        self.resizeEvent(event)

    def resizeEvent(self, event):
        x = self.geometry().center().x()
        y = self.geometry().center().y()

        self.loading_overlay.move_custom(x, y)



    def show_loading(self):
        blur_effect = QGraphicsBlurEffect()
        blur_effect.setBlurRadius(5)

        self.main_widget.setGraphicsEffect(blur_effect)

        self.loading_overlay.show()

        QTimer.singleShot(3000, self.hide_loading)

    def hide_loading(self):
        self.loading_overlay.hide()
        self.main_widget.setGraphicsEffect(None)



if __name__ == '__main__':
    

    app = QApplication([])
    
    window = MainWindow()
    window.show()
    
    app.exec()


bunu incelersen kendi kodlarına uygulaya bilirsin.

senin çalışan fonksiyonunda buna benzer bir şey olucak

def readRecords():
    blur_effect = QGraphicsBlurEffect()
    blur_effect.setBlurRadius(5)

    self.ui.setGraphicsEffect(blur_effect)

    self.loading_overlay.show()
    
    
    sayac = 8
    self.ui.recordDetail.clear()

    for i in range(8,38):
        # crc hesaplat
        input_data = f"58 0 1 16 {sayac} 0 0 0"
        print(sayac)
        dataSend = self.createCRCandData(input_data, sayac)
        sayac += 1
        self.send_message(dataSend)
        res = self.receive_message()

        if self.getAndControlCRC(res):
            print("gelen cevap: " + res)
            dataName1 = self.hexToDecimal(res.split(" ")[3])
            dataName2 = self.hexToDecimal(res.split(" ")[4])

            ## veri alma
            parameter = int(self.hexToDecimal(res.split(" ")[5]))
            #
            ## veri alma
            dataSayac = 1
            reciveData = ""
            for j in range(parameter):
                try:
                    reciveData += self.hexToDecimal(res.split(" ")[parameter + 1 + dataSayac])

                    dataSayac += 1

                except Exception as e:
                    print(e)

            self.reciveData[f'{dataName1} {dataName2}'] = f'{reciveData}'

        else:
            print("\n Veri yanlış geldi!!")


    say = 8

    for write in range(8,38):
        dataName = self.veri_dict[f'16 {say}']
        data = self.reciveData[f'16 {say}']

        say += 1

        print(say)
        self.ui.recordDetail.append(f"{dataName} : {data}")

    self.loading_overlay.hide()
    self.ui.setGraphicsEffect(None)

tabi şu classı ve diğer kodları kendi koduna eklemen lazım

koda aynı şekilde uyguladım teşekkürler ama bir sorun var.

init() kısmında başlatınca yüklenme ekranı çalışıyor ama ben bunu fonksiyonun içine koyduğumda yanı readRecords() fonksiyonuna program bir süre çalışmayı durdurduğu için yükleme ekranını göstermiyor ve işlem bitince kendine geliyor program. Program kendine gelincede yükleme ekranını sonlandırıyoruz yani arada kaynıyor

senin kodunu QThread ile birleştirince çalıştı ufak bi hata var birden fazla kez ekrana tıklayınca yine yanıt vermiyor ama artık yüklenmesini bekliyicekler :slight_smile:

thread kullanarak çalıştırınca donma sorununu çöze bilirsin evet, ama doğru uygulanmalı, diğer sorunu tam açıklarsanız yardımcı olmaya çalışırım.forumda özelden mesaj atma özelliği var, eğer kodlarınızı herkese açık paylaşmak istemiyorsanız, oradan bana yaza bilirsiniz.

bu şu satırla ilgili ola bilir

bu satrın amacı LoadingOverlay penceresi gözüktüğünde arkadakı pencereyi tıklanılmaz hale getirmekdir.
eğer not responding gibi bir hata beliyorsa bu threadın doğru kullanılmasıyla ilgili

teşekkürler yanıtın için bir yöntem buldum asyncio kütüphanesi ve await async deyimlerini deneyeceğim