Python OOP ve ALARM

class Clock():
    def clock(self):
        import datetime
        self.zaman = datetime.datetime.now()
        self.saat = datetime.datetime.strftime(self.zaman,"%X")
        print(self.saat.rjust(90))

class Date():
    def __init__(self):
        print("Tarih Gösteriliyor...")
        import time
        time.sleep(2)

    def turkce(self):
        import locale
        locale.setlocale(locale.LC_ALL, "")

    def date(self):
        import datetime
        self.turkce()
        self.an = datetime.datetime.today()
        self.tarih = datetime.datetime.strftime(self.an,"TARİH: %d %B %Y")
        print(self.tarih.rjust(90))

class Alarm():
    def __init__(self,saat,dakika):
        self.saat = saat
        self.dakika = dakika
    def alarm(self):
        import time
        import os
        zaman = time.localtime()
        if self.saat == zaman.tm_hour and self.dakika == zaman.tm_min:
            a = 0
            while a<10:
                time.sleep(0.5)
                print("SAAT:{} VAKİT GELDİ.")
                a += 1
            os.chdir("C:\\Users\A s u s\Dekstop")
            os.startfile("TAVUK ALARM SESİ MUHTEŞEM.. UYANAMAMAYA SON!!.mp3")

def istek():
    clockdatealarm= input("\nCLOCK --> s or S \n"
                     "DATE  --> t or T \n"
                    "ALARM --> a or A \n")
    return clockdatealarm.lower()
def alarm_bilgisi_al():
    saat = input("SAAT : ")
    dakika = input("DAKİKA : ")
    return saat,dakika


if __name__=="__main__":
    while True:
        istek()
        if istek() == "s":
            s = Clock()
            s.clock()

        elif istek() == "t":
            s = Date()
            s.date()

        elif istek() == "a":
            a,b = alarm_bilgisi_al()
            s = Alarm(a,b)
            s.alarm()

Hem nesne tabanlı programlama için hemde datetime,time ve os modülleri için pratik yapmak istedim ve alarm-saat-tarih uygulaması yaptım fakat birkaç sorun yaşıyorum.
1-Programı çalıştırınca bazen çıktı alıyorum bazen alamıyorum bu neden kaynaklanıyor?
2-Alarm sınıfını çalıştırıyorum fakat saat ve dakika istedikten sonra sonuçlanmadan döngü başa gidiyor?
3-Son sorum ise sınıflar dışındaki kodları nasıl sadeleştirebilirim?

Kodlarım biraz gereksiz gibi ama alıştırma yapmak için…Şimdiden teşekkür ederim. :smiley:

Programi calistirdigin anda

CLOCK --> s or S 
DATE  --> t or T 
ALARM --> a or A 

gibi bir cikti alman lazim. Bunu almiyorsan, programi calistirdigin ortamda (terminal, IDE, vs) sorun var demektir.

Sonuclanmaktan kastin ne?

Daha dogrusu soyle sorayim, alarm fonksiyonundan beklentin ne?
Daha guzel bir isim verseydin hem ben hem de sen sorunu daha iyi anlayabilirdik. Mesela su anda almasi gereken isim “alarm_saati_geldiyse_ses_cikar”. Gelmediyse hic bir sey yapmadan donuyor. Amac buysa dogru. Alarm saatine kadar beklemesini istiyorsan, bekleme kodu yazman lazim. Arkaplanda calismasini istiyorsan, baska bir kod yazman lazim.

Siniflar disinda cok bir kod yok. Kullanicidan istek yapan fonksiyonlar ayrilmis ki bu da guzel bir sey; benzer isleri yapan kodlarin benzer yerlerde toplanmasi iyi bir sey.

Menu sistemi icin { 'harf_veya_harfler': yapilacak_aksiyon() } gibi bir dictionary sistemine gecebilirsin ama uc secenek icin cok gerekli degil.

OOP’nin gereksizligini zaten gormussun ama ozellikle sadelestirmeyi sordugun icin, s = Date(); s.date() seklindeki kodlarin sinifsiz tek bir fonksiyon + o fonksiyonun cagrilmasina indirgenebilecegini hatirlatmak isterim.


Bunlar disinda menu sisteminde buyuk bir bug var; kullanicidan 4 kere istek yapiliyor. Ilk istegin sonucu cope atiliyor, ikincisi “s” ise saat calisiyor, ucuncusu “t” ise tarih… Bir kere istek yapilip sonucunun kullanilmasi lazim.

sonuçlanmasından kastım şu.Öncelikle

CLOCK --> s or S 
DATE  --> t or T 
ALARM --> a or A 

bu menü gelecek kullanıcı seçimini yapacak.Seçimden sonra işlemin devam etmesi gerekiyor.Ama bazen seçimi işleme alırken bazen işleme almayıp tekrar bu menü geliyor.Seçim işleme alınsa bile mesela kullanıcı “a” ya basınca saat ve dakika isteniyor bundan sonra vakti gelene kadar beklemesini istiyorum(bekleme kodu ve arka planda çalışamsı için kodlar nedir?).
Fakat yine saat ve dakika istiyor

class Alarm():
def __init__(self,saat,dakika):
    self.saat = saat
    self.dakika = dakika
def alarm(self):
    import time
    import os

import” komutları normalde programın en başına konulur. Bunu yapmasanız bile aynı modülü defalarca tekrarlanabilecek bir şekilde içe aktarmanız yanlış. Bu “import” komutlarını programınızın en başına koymanız ve de bunu alışkanlık haline getirmeniz daha uygun olacaktır.

Oncelikle istersen aciklamani yarim kesmis (paragrafinin basi ve sonu alarm fonksiyonalitesinden bahsederken ortasi bug’a deginiyor) ve benim de cevabimin son kismini ayirdigim bug’a odaklan, onu duzelt.

Beklemek icin time.sleep fonksiyonuna, arkaplanda calismak icin de threading modulune bakabilirsin.

Sınıf niteliklerini yazdığımız yere mi yazayım importları.Yani class Alarm hemen sonra mı?

Threading modülüne çalışacağım fakat bug neyden kaynaklanıyor çok uğraştım fakat bulamadım.Sizce bunu boşvermem mi gerekiyor :grinning:

import ” komutları normalde programın en başına konulur.

Yukarıdaki cevabımda belirttim zaten.

Cozumunu de yazdim aslinda. Fonksiyonun bir kere cagrilip dondurdugu degerin kontrol edilmesi lazim. Su anda her kontrol icin ayri cagri yapiliyor…