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.
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.