Kronometre Uygulamasında hata

Merhaba Arkadaşlar, kendi çapımda gayet basit bir uygulama geliştirmek istiyorum. Ancak aşağıdaki kodda hata alıyorum. Tam anlamıyla bir hata kodu çıkmasada uygulamada istediğim sonucu alamıyorum. Amacım Bir döngü oluşturup (Aşağıda yaptığım gibi 10dan geriye sayma gibi) ve döngü her döndüğünde label’ın text’ini değiştirmek ancak her döngüden sonra (yani her i değerinden sonra) time.sleep() metodunu kullanarak 1 saniye bekletmeye çalıştım. Böylelikle gerçekten 10’dan geriye sayabilecektim. Ancak olay beklediğim gibi gerçekleşmedi ve time.sleep() metodunda sonrası tamamen çalışmadı ve uygulama 10’dan geriye saymak yerine 10 saniye bekleyip sonra ekrana bir yazdırdı. Kodu aşağı bırakıyorum

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel
from PyQt5.QtGui import *

import time

class MainWindow(QMainWindow):
def init(self):
super().init()
self.initUI()
self.timer()
self.setWindowTitle(‘Pomodoro Timer’)
self.showMaximized()
self.show()

def initUI(self):
    self.lbl = QLabel('30:00', self)
    self.lbl.setFont(QFont('Arial', 200))
    self.lbl.adjustSize()
    self.lbl.move(355, 170)

def timer(self):
    for i in range(10, 0, -1):
        self.lbl.setText(str(i))
        time.sleep(1)

def main():
app = QApplication(sys.argv)
win = MainWindow()
sys.exit(app.exec_())

if name == ‘main’:
main()

time.sleep yaptığınızdabütün kodu blokluyor
image
bu örnekteki gibi kurgulamalısnız

Merhaba, bu iş için thread mekanizmasını incelemelisiniz. Thread in ne olduğunu bilmiyorsan bu forumda thread’le ilgili yardımcı postlar bulabilirsin. Örnek olarak uzun zaman önce sorduğum bir soruya bakabilirsin.

https://forum.yazbel.com/t/kullaniciya-sifreyi-girebilmesi-icin-10-saniye-tanima

Eğer bu postu anladıysan şimdi Google’da rahatça PyQt5 QThread Example diye aratma vakti. (UYARI: Pyqt5’ kullanarak yazdığın bir programda threading.Thread kullanma, onun yerine Pyqt5’de kullanılan QThread i kullan.)

@eXcalibur , Yani nasıl kurgulanacağını merak ettim doğrusu. Konuyu çözümlemek adına çok uzak bir yaklaşım. Neden işin içine async yi karıştırdın ki, cevabın, sorunu çözme adına çok uzak bir yaklaşım.

Yardımcı olduğunuz için teşekkürler çözümünüzü deneyeceğim.

Thread konusu hakkında bir bilgim yok. Sizinde yardımlarınızla elimden geldiğince araştıracağım yardımcı olduğunuz için teşekkür ederim.

Burada QTimer nesnesi ile yapılmış örnek bir dijital saat uygulaması çok basit düzeyde. Bundan faydalanabilirsin.

import sys
from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayout,QLabel
from PyQt5.QtCore import QTimer,QDateTime

class WinForm(QWidget):
    def __init__(self,parent=None):
        super(WinForm, self).__init__(parent)
        self.setWindowTitle('QTimer example')

        self.listFile=QListWidget()
        self.label=QLabel('Label')
        self.startBtn=QPushButton('Start')
        self.endBtn=QPushButton('Stop')

        layout=QGridLayout()

        self.timer=QTimer()
        self.timer.timeout.connect(self.showTime)

        layout.addWidget(self.label,0,0,1,2)
        layout.addWidget(self.startBtn,1,0)
        layout.addWidget(self.endBtn,1,1)

        self.startBtn.clicked.connect(self.startTimer)
        self.endBtn.clicked.connect(self.endTimer)

        self.setLayout(layout)

    def showTime(self):
        time=QDateTime.currentDateTime()
        timeDisplay=time.toString('yyyy-MM-dd hh:mm:ss dddd')
        self.label.setText(timeDisplay)

    def startTimer(self):
        self.timer.start(1000)
        self.startBtn.setEnabled(False)
        self.endBtn.setEnabled(True)

    def endTimer(self):
        self.timer.stop()
        self.startBtn.setEnabled(True)
        self.endBtn.setEnabled(False)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    form=WinForm()
    form.show()
    sys.exit(app.exec_())

İşin içine thread vb katmaya gerek yok orda uygulamanın çökmesinin sebebi time.sleep in bütün uygulamayı bloklaması.Benim attığım async ise uygulamanın sadece o kısmı blokluyor.image

1 Beğeni

Hımm, anladım seni şimdi. Bilgi için teşekkür ederim. Açıkçası ben pek async ile pyqt5 kullanan pek bir örnek görmedim, bu arada async ile daha önce hiç uğraşmadım. Müsait bir zaman bulabilirsem deneyeceğim.

1 Beğeni