Python Tkinter sqlite yardım arkadaşlar

Kodunuzu olduğu gibi PyCharma yapıştırdım ve 96. satırda sorun olduğunu belirtti PyCharm
Önce bu sorunu çözelim.
96.Satırdaki kod bu
tb_aden3.focus()
baktığım zaman tb_aden3 ün üstüne imleci getir diyor ama tb_aden3 diye bir değişkenimiz yok tb_aden3 yerine isim yazarak hatayı çözebiliriz.
Sonra kodunuzu denediğimde btnsil tuşuna bastığımda tüm verilerin silindiğini gördüm bence bu mantıksız o yüzden btnsil i btn_temizle yapacağım.

btnsil = tk.Button(text='Sil.', command=lambda: Lb1.delete(0, tk.END), background="grey", foreground="black")
btnsil.place(x=730, y=530)

Bu 2 satırı bunla değiştiriyorum.

 btn_temizle = tk.Button(text='Temizle', command=lambda: Lb1.delete(0, tk.END), background="grey", foreground="black")
 btn_temizle.place(x=730, y=530)

Bi tanede sil butonu yapalım ama ondan önce btn_temizle hala gönder fonksiyonunun içinde onu dışarı alıyorum btngönder in altına.
Şimdi sil butonunu yapabiliriz.
btn_sil diye bir buton oluşturuyorum

btn_sil = tk.Button(text='Sil', background="grey",foreground="black")

Şimdi bunu ekranımıza yerleştirelim önceki butonlara bakıyorum.
image
Birinde y 500 diğerinde 530 demek ki bu butonumun da y si 560 olacak
btn_sil.place(x=730, y=560)
Şimdi bunun commandını yazalım tek satırda yapabileceğim için lambda kullanıyorum def ile fonksiyon oluşturmayacağım
command=lambda :Lb1.delete(Lb1.curselection())
Lb1 den Lb1 de seçilen nesneyi sil fakat bunu kullanan kişi eğer birini seçmeden tıklarsa uyarı verdirmemiz lazım. Bunu ise Lb1.curselection() un değeri ile yapacağız.

    btn_sil = tk.Button(text='Sil',command=lambda :Lb1.delete(Lb1.curselection() if Lb1.curselection() else messagebox.showerror("Hata","Lütfen silinecek nesneyi seçiniz")), background="grey",foreground="black")

Yani kodumuz böyle oluyor. Kodu çalıştırdığımda gönder tuşuna bastığımda çok fazla hata penceresi çıkıyor gönder tuşuma bastığımda gönder fonksiyonu çalışıyormuş ve oradaki kod ise şöyle

        if isim.get() == "":
           messagebox.showerror("Hata Boş!.", "Boş Bırakmayınız.")
        if soyisim.get() == "":
           messagebox.showerror("Hata Boş!.", "Boş Bırakmayınız.")
        if adsoyad.get() == "":
           messagebox.showerror("Hata Boş!.", "Boş Bırakmayınız.")
        if gmail.get() == "":
           messagebox.showerror("Hata Boş!.", "Boş Bırakmayınız.")
        if tc.get() == "":
           messagebox.showerror("Hata Boş!.", "Boş Bırakmayınız.")
        if adres.get() == "":
           messagebox.showerror("Hata Boş!.", "Boş Bırakmayınız.")
        strings= [isim.get(), soyisim.get(), adsoyad.get(), gmail.get(), tc.get(), adres.get()]
        Lb1.insert("end",strings)
        entry_temizle()
        isim.focus()

Baktığımızda birden çok if kullanıldığını görüyoruz elif kullanılmadığı için bu ifler birbirinden bağımsız yani hepsinin koşulu uyuyorsa hepsinin içi çalışıyor. Bunu 2 farklı yolla çözebiliriz ilki ilk if hariç diğer ifleri elif yapmak ikincisi ise tüm koşulları tek ifte toplamak ben 2.yi tercih ettim. if dışındaki kodlarıda elsenin içine aldım

if isim.get()=="" or soyisim.get()=="" or adsoyad.get()=="" or gmail.get()=="" or tc.get()=="" or adres.get()=="":

(Boş Bırakmayınız yazısı saçma bence onu Boş alan bırakmayınız ile değiştirebilirsiniz).Şimdi data işlemine başlayacaktım ama bazı kütüphanelerin 2 kere import edildiğini gördüm yeni pencere fonksiyonunun ilk 2 satırı onları siliyorum.


İmportların altına sqlite3 kemik yapısını kuruyorum.

data = sqlite3.connect("veriler.db")
imlec=data.cursor()
imlec.execute("CREATE TABLE IF NOT EXISTS tablo(isim TEXT, soy_isim TEXT, ad_soyad TEXT, gmail TEXT,tc TEXT,adres TEXT)")

Şimdi data ile ilgili işlemleri yapabiliriz.
Öncelikle verial fonksiyonu yazıyoruz.
verial diye bir fonksiyon oluşturdum içine aşağıdaki kodu yazdım.

    def verial():
        Lb1.delete(0,tk.END)
        imlec.execute("SELECT * from tablo")
        for i in imlec:
            Lb1.insert("end"," ".join(i))

Listedeki verileri sil tüm verileri seç sonra bu verlerin içindeki her satırı i ye ata bu iyi de Lb1e ekle.
Şimdi diğer işlemleri dataya uyarlayalım.
gönder fonksiyonundan başlıyorum if in içiyle işimiz yok elsenin içine bakıyorum

strings= [isim.get(), soyisim.get(), adsoyad.get(), gmail.get(), tc.get(), adres.get()]
            Lb1.insert("end",strings)
            entry_temizle()
            isim.focus()

İlk 2 satırı siliyorum onun yerine datama eklersem ve veri alma fonksiyonunu çalıştırırsam dataya ekleyecek ve sonra listeyi güncelleyeceği için istediğimiz olacaktır.

imlec.execute("INSERT INTO tablo values(?,?,?,?,?,?)",(isim.get(),soyisim.get(),adsoyad.get(),gmail.get(),tc.get(),adres.get()))
data.commit()
verial()

Şimdi silme ve temizleme işlemini de değiştireceğiz ama artık karmaşıklaştığı için lamda yerine fonksiyon kullanıyorum.Butonların commandını değiştirelim

    btn_temizle = tk.Button(text='Temizle', command=temizle, background="grey",foreground="black")
    btn_sil = tk.Button(text='Sil',command=sil, background="grey",foreground="black")

Şimdi sil ve temizle fonksiyonlarını yazalım.

    def temizle():
        imlec.execute("DELETE FROM tablo"),
        data.commit()
        verial()

Tüm verileri sil ve verial fonksiyonunu çalıştır.

    def sil():
        if Lb1.curselection():
            imlec.execute("DELETE FROM tablo WHERE rowid=?",(Lb1.curselection()[0]+1,))
            data.commit()
            verial()
        else:
            messagebox.showerror("Hata","Lütfen silinecek öğeyi seçiniz")

Eğer Lb1 de bir şey seçildiyse satır id si Lb1 de seçilen şeyin indexinin 1 fazlası olan ögeyi sil burda neden 1 ekledik Listboxun indexi 0 ile başlar ama satır idsi 1 ile başlar peki neden Lb1.curselection()[0]+1 yazmadık da tuple şeklinde gönderdik derseniz execute 2.parametre olarak tuple alıyor ama neden sonda virgül var derseniz eğer o virgülü koymazsa python bunu tuple değil integer alıyor.

1 Beğeni