MongoDB ile çekilen veri Listbox da buga giriyor

Merhaba,

Dostlar MongoDB ile çektiğim veriler def bastığım sürece aynı verileri tekrardan getiriyor.

Şimdi ben bu menü sistemini def ile çalıştırıyorum. Nereye tıklarsak o bölümün def i geliyor.

Ben Sınıf Yönetimi kısmına gelince ListBox kısmındaki veriler tekrar geliyor.


Üstte menüden “Sınıf yönetimi” kısmına tam 4 kere tıkladım ve mongoDB ile çektiğim veriler 4 kere yüklendi.

Bu bug u nasıl çözebilirim?

Kodlar:

sinifadiyazma = Entry()

liste = Listbox()

def SinifYonetimi_SinifEkle():

    sinifadiyazma.get()

    gg = sinifadiyazma.get()

    liste.insert(1, gg)

    siniflar.insert({"sinif": gg})

    

sinifeklebuton = Button(text="Sınıf Ekle", command=SinifYonetimi_SinifEkle)

aa = SinifYonetimi_SinifEkle

def sinifYonetimi_SinifSil():

    veri = liste.curselection()

    yazil = liste.get(veri)

    print(yazil)

    liste.delete(veri)

    siniflar.delete_many({"sinif": yazil})

silbuton = Button(text="sil", command=sinifYonetimi_SinifSil)

def sinifYonetimi():

    sinifyonetimiaciklama = Label(fg="white", bg="#202020")

    veriyicek = siniflar.find().sort("sinif")

    i = 1

    for x in veriyicek:

        print(x["sinif"])

        liste.insert(i, x["sinif"])

        i = i + 1

        liste.configure(width=50)

    sinifeklebuton.grid(column=3, row=5, sticky=E)# Buton

    liste.grid(column=2, columnspan=3)

    sinifadiyazma.grid(column=3, row=5, sticky=NW)# Entry

    sinifadiyazma.configure(width=30)

    silbuton.grid(column=2, columnspan=3)

    silbuton.configure(width=10, height=1)

    islemsec.grid_remove()

    

    sinifyonetimiaciklama.config(text="Sınıf yönetimi kısmına hoş geldiniz. Bu bölümden sınıf ekleyebilir ve silebilirsiniz. Örnek sınıf adı: 10 B")

    sinifyonetimiaciklama.grid(row=1, column=2)

menubuton2 = Button(text="Sınıf Yönetimi", fg="white", bg="#282528", height=4, command=sinifYonetimi)

Nasıl çözebilirim bu bug u? Şimdiden teşekkürler.

Oncelikle kullandigin dili duzeltmen lazim. Sebep↔sonuc iliskisi hangi yonde bilmiyorum fakat dilin yanlis kullanimiyla programlarin nasil calistigini anlamama, basit sorunlari cozememe arasinda yuksek bir korelasyon var.

def bir anahtar kelime, fonksiyon tanimliyor ve basilabilen bir sey degil.

Programlari parca parca incelemen lazim. Mesela MongoDB’nin problemle bir alakasi yok. Bunu goremiyorsan, MongoDB’den gelen verileri MongoDB’den gelmis gibi yapip programi tekrar deneyebilirsin.

Ayni sekilde, bir yere 4 kere tikladiginda bir sorun olusuyorsa, sorunun tiklamayla mi yoksa tiklandiginda cagrilan fonksiyonla mi alakali oldugunu anlamak icin, 4 kere tiklamis gibi yapan bir kod* yazip calistirabilirsin. Sorun devam ediyorsa tiklamayla alakasi yoktur ve kullanici arayuzunun ekran goruntulerini almakla ugrasmak zorunda kalmazsin.


*: Mesela tiklandiginda cagrilan fonksiyonu 4 kere cagiran

1 Beğeni

Hocam aslında sorunu biliyorum ama çözemiyorum.

menubuton2 = Button(text="Sınıf Yönetimi", fg="white", bg="#282528", height=4, command=sinifYonetimi)

Bu satırda command= kısmı sürekli sinifYonetimi çalıştırıyor. Yani her şeyi tekrardan ekliyor. Ama ben nasıl sadece 1 kere eklenmesini sağlayacağım bilmiyorum.

@dildeolupbiten Hocam bilginiz var mı?

Aklıma ilkel bir yöntem geldi. Global bir değişken oluştururak onu sayaç gibi kullanabilirsiniz.
sinifYonetimi isimli fonksiyon çağırıldığında, belirli bir koşul cümlesi ile o global değişkeni kontrol edip, yalnızca 1 kez gerçekleşmesini sağlayabilirsiniz.
Fonksiyon gerçekleştiken sonra mesela a += 1 diyerek değerini artırırsınız. Koşul cümlesi de
if a == 0:
şeklinde olabilir.

Veri eğer ki varsa bir daha yüklemesin diyorsunuz sanırım. Fakat bu yöntem bu yazılım için uygun olmaz.

Amaç aynı verinin tekrar eklenmesini önlemek ise, bu verinin ekli olup olmadığını kontrol etmenin nesi uygun değil?

Hocam şimdi şöyle:

Tamam uygun olabilir fakat karışıklıkta olabilir.

Mesela yazılımda kimisi 10 tane sınıf ekler, Kimisi 5 tane. Ben bu verilerin ID numaralarını hangi sayıya kadar sorgulayacağım? Sorun bu. for döngüsü ile yapacağım fakat bunu nasıl yapabilirim. Aklıma fikir gelmiyor.

Dediğiniz yönteme uygun şöyle bir kod yaptım:
veriyicek = siniflar.find().sort(“sinif”)

i = 1

for x in veriyicek:

    print(x["sinif"])

    ezz = x["sinif"]

    xx = liste.get(ezz)

    print(xx)

Fakat hata verdi. listbox ID numarası istiyor ama o numarayı nasıl tespit edebilirim?

@dildeolupbiten @Gok_Mavisi_Anka

Hocalarım şöyle bir kod yaptım ama hata alıyorum.

i = 1

i = i + 1

def aga():

    for x in veriyicek:

        g = x["sinif"]

        print(g)

def kontroll(gg):

    for z in aga:

        gg = aga

        asd = liste.get(gg)

        

        if asd == True:

            print("Var")

        else:

            print("Yok")

aga()

kontroll()

Nasıl çözebilirim?

kontroll() fonksiyonunu belirtirken parametre belirtmişsin. Fakat fonksiyonu çağırırken herhangi bir parametre girmemişsin.

def kontroll(gg) burada gg yerine ne yazmak istiyorsan, fonksiyonu çağırırken kontrol(gg) şeklinde çağırmalısın.

Ayrıca parametre olarak gg neden belirledin? Fonksiyon içerisinde gg değerini zaten aga olarak değiştirmişsin. Parametre olan gg’yi silersen sorun çözülecektir diye düşünüyorum.
def kontroll(): şeklinde tanımlamalısın.

Hocam kodları yaparken baya mantıksız ilerlemişim. Tam olarak nasıl bir yol izlemeliyim?

Kusura bakmayın yorduysam. Sıfırdan bir yol haritası belirtir misiniz?

Yanlış anlama ama ben henüz hoca değilim :smiley: Yalnızca 3 aydır ilgileniyorum yazılımla. Yine de bir kaç tavsiyede bulunabilirim. Değişken isimlerini belirlerken neye göre belirledin bilmiyorum fakat bakılınca herhangi bir şeyi anımsatmıyolar ve biraz karışıklığa sebebiyet veriyor. Aynı şekilde fonksiyon isimlerinden yalnızca kontroll mantıklı bir isme sahip. Ben çalışırken daha derli toplu çalışmayı hedeflediğimden fonksiyonları genelde tek çatı altına toplamak amacıyla sınıflar (class) oluştururum ve değişkenleri de buna göre isimlendiririm. Mesela class insan: olarak bir sınıf oluşturacaksam, değişkenlerin isimleri de yas, soyad, boy, cinsiyet gibisinden olurlar. Bu da çalışırken hem moral veriyor, hem de işleri kolaylaştırıyor. Ki aslında kolaylaşması orada asıl moral veren şey. Dilersen bu konuda daha uzman olan kişilerin görüşlerini almak amacıyla yeni bir konu oluşturabilirsin. Forum kurallarına bağlı olarak konudan fazla uzaklaşmayalım.

1 Beğeni

Anladım teşekkür ederim. @dildeolupbiten hocamın yanıtını bekleyeyim en iyisi. Kendisi gayet mükemmel.

Yazdığınız kodda çok hatalar var ve bunlar sizin bazı konuları tam anlamıyla anlamadığınızı gösteriyor. Bence kütüphanelerle çalışmadan fonksiyonlar dahil olmak üzere oraya kadar olan konuları iyice bir öğrenmeye çalışın.

Mesela, aga isminde bir fonksiyon tanımlıyorsunuz. Sonra kontroll fonksiyonunda for z in aga gibi bir kod yazıyorsunuz. Neden böyle bir ifade yazdınız, neyi amaçlıyordunuz hiç bilmiyorum.

Ayrıca i = 1 demişsiniz. Sonra da i = i + 1 demişsiniz. Buna ne gerek vardı, doğrudan i = 2 niye demediniz bilmiyorum. Neredeyse kodun tamamı yanlış.

Bu durumda nasıl yardım edebilirim doğrusu bilmiyorum.

i nedeni listBox da ID sorgularken eklemiştim. Sonra artık gerek kalmadı ve işlevden kaldırdım ama kodu sildim.

agakontroll fonksiyonunda tanımlamın nedeni ise:

Şimdi aga verilerin value değerini çekiyor. def kontroll de ise o value değerlerini listBox da sorguluyor. Bunu yapmayı hedefledim.

@dildeolupbiten for z in aga’nin sebebini merak etmiyor; sebebi ne olursa olsun boyle bir kod yazan birine karmasik konularda yardim edemedigimizi soylemeye calisiyor.

Burada ne demek istedigini sorsam, cogu kisinin anlayabilecegi bir dilde ifade edebilir misin?

1 Beğeni

Bence terminolojiyi de bir gözden geçirmeniz gerekiyor. Çünkü aga isimli fonksiyon, kontroll isimli fonksiyonun içinde tanımlanmıyor, global alanda tanımlanıyor. Bir fonksiyonu tanımlamak demek def fonksiyon_ismi(): ... şeklinde bir ifade yazmak demek. Bu ifade, fonksiyon_ismi isimli bir fonksiyonu tanımlar.

İyi ama aga’dan bir şey return edilmemiş olmasına rağmen, kontroll fonksiyonunda gg = aga diye bir kod yazıyorsunuz. Üstelik bu ifade gg isimli başka bir fonksiyon tanımlar. Fonksiyondan dönen değeri gg’ye eşitlemez.

aga tek başına kullanıldığında bir fonksiyonun ismi olarak görev yapar. aga() şeklinde kullanırsanız, bu fonksiyon çağrılır. Şayet aga() fonksiyonu bir değer döndürüyorsa a = aga() ifadesiyle de fonksiyondan dönen değeri a isimli bir değişkene atarsınız.

Kusura bakmayın biraz saçmalamışım.

Şöyle bir yöntem buldum:

Şimdi biz bu verileri MongoDB den çektiğimize göre koleksiyonda bulunan toplam verilerin sayılarınıda çekebiliriz. yöntem ise: Eğer ki ListBox içerisindeki itemler, MongoDB den çekilen veri sayısını geçerse yeniden yüklemesini engelleyeceğim.

listboxdakitemler > databasedakiverisayisi

şeklinde… Bu yöntemi koda dökmeye çalışıyorum.