PyQt5 de penceremi zamanlamak istiyorum

QT Desinger ile bir kaç ara yüz tasarladım hepsi birbiri ile bağlantılı ara yüzler. Benim istediğim şey örnek vermek gerekirse CS6 açılışında bizi karşılayan bekleme ekranından yapmak. Daha doğrusu o ekrandan yaptım. Sorunsuz çalışıyor. Ancak ben o ekranı program açıldıktan sonra 3sn kadar ekranda tutup tekrar kapanmasını istiyorum. Time modülünün sleep() fonksiyonunu kullandım ancak çalışmıyor. 3 sn kadar bekliyor ama açılış ekranı sorunlu bir şekilde dönderiliyor. Altta resimde görüldüğü gibi kodları yadım.

def acilis_fonk(self):
self.win1 = QMainWindow()
self.acilis = Ui_Acilis()
self.acilis.setupUi(self.win1)
self.win1.show()
time.sleep(5)
self.win1.close()

time.sleep()'i doğrudan kullanmanızla alakalı diye düşünmekteyim. Kodlarınıza threading kütüphanesini dahil edebilirsiniz.
Örnek kullanım:

import time
from threading import Thread

class Timer:
    def __init__(self):
        self.initial = None
        self.current = None
        self.delay = None
        self.function = None
        self.args = None
        
    def start(self, function, delay, args=[]):
        self.args = args
        self.function = function
        self.delay = delay
        self.initial = time.perf_counter()
        Thread(target=self.check).start()
        
    def check(self):
        while True:
            self.current = time.perf_counter()
            difference = self.current - self.initial
            
            if difference >= self.delay:
                self.function(*self.args)
                break
            else:
                time.sleep(1/20)
                

def say(text1, text2):
    print(text1, text2)


Timer = Timer()

# 5 saniye sonra say fonksiyonunun çalışması için:
Timer.start(say, 5, args=["Hello", "World!"])

acilis_fonk() fonksiyonunun dahil olduğu sınıfa X diyelim. X sınıfında yeni fonksiyon oluşturalım.

def kapat(self):
    self.win1.close()

Şimdi de ayrı bir sınıf olarak Timer sınıfını kodumuza ekleyelim.
Bundan sonra da kod akışımız şu şekilde olsun.

X.acilis_fonk()
Timer.start(X.kapat, 5)

args = [] olarak belirtildiğinden burada ek olarak belirtmeye gerek yok.
Bunları yapmadan önce acilis_fonk() fonksiyonunun son 2 satırını silmeyi unutmayın.

QT’nin bu iş için hazır fonksiyonu mevcut.


QTimer.singleShot(3000, çalışacak_fonksiyon)

Argüman olarak bekleme süresi ve çağrılacak fonksiyonu veriyoruz.

1 Beğeni

Cevaplariniz icin tesekkur ederim hemen denicem :slight_smile:

bu yolu denedim ancak acilis ekrani kapanmiyor. 3000 dendim once ondan kaynaki sandim 3 yaptim orayi ancak ondan kaynakli değilmis. Gök mavisi anka hocaminda çozum yolunu pek anlamadim :frowning:

Sorunu classları tek bir .py dosyasında toplayarak QTimer.singleShort() fonksiyonunu kullanarak çözdüm. ben qt desingerden yaptığım classları import ederek yapmaya çalışıyordum. o şekilde neden olmadı bilmiyorum ama tek .py dosyasına koyunca istediğim şekilde çalıştı.

self.timer = QTimer(self)
self.timer.singleShot(3000, self.kapat)
def kapat(self):
        self.close()
        self.app = Ui_SignIn()