ELSAT
Ağustos 28, 2023, 7:55öö
1
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.
Asif
Ağustos 28, 2023, 4:42ös
2
Kodlarını atarsan yardımcı olmaya çalışırım.
ELSAT
Ağustos 29, 2023, 8:02öö
3
ş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
Asif
Ağustos 29, 2023, 2:15ös
4
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.
Asif
Ağustos 29, 2023, 2:19ös
5
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
Asif:
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)
ELSAT
Ağustos 29, 2023, 7:51ös
6
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
ELSAT
Ağustos 29, 2023, 8:52ös
7
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
Asif
Ağustos 30, 2023, 7:43öö
8
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.
Asif
Ağustos 30, 2023, 7:47öö
9
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
ELSAT
Ağustos 30, 2023, 11:37öö
10
teşekkürler yanıtın için bir yöntem buldum asyncio kütüphanesi ve await async deyimlerini deneyeceğim