Database'e buton ile kayıt yapamıyorum

Aldığım hata mesajı" #sqlite3.OperationalError: near “)”: syntax error"
kodlarım şöyle:
from tkinter import*
import sqlite3

vt = sqlite3.connect(‘deneme3.db’)
im = vt.cursor()

def create_table():
im.execute(""“CREATE TABLE IF NOT EXISTS ana(
Customer_Id INTEGER PRIMARY KEY,
algi TEXT,
bilge TEXT,
duygu TEXT,
destek TEXT,
bos TEXT)”"")

create_table()

root=Tk()
root.title=(‘Bilge İle Sohbet’)

algi = “”
bilge = “”
duygu = “”
destek = “”
bos = “”

#String tipleri
algi = Text()
bilge = Text()
duygu = Text()
destek = Text()
bos = Text()

#Etiketler
bLabel = Label(root, text="")
algiLabel = Label(root, text=“Algı”)
bilgeLabel = Label(root, text=“Bilge”)
duyguLabel = Label(root, text=“Duygu”)
destekLabel = Label(root, text=“Destek”)
bosLabel = Label(root, text=“Boş”)

bLabel.grid(row=0, column=0)
algiLabel.grid(row=1, column=0, padx = 10, pady = 10)
bilgeLabel.grid(row=1, column=2, padx = 10, pady = 10)
duyguLabel.grid(row=2, column=0, padx = 10, pady = 10)
destekLabel.grid(row=3, column=0, padx = 10, pady = 10)
bosLabel.grid(row=4, column=0, padx = 10, pady = 10)

#Entry alanları
algiB = Entry(root, textvariable = algi)
bilgeB = Entry(root, textvariable = bilge)
duyguB = Entry(root, textvariable = duygu)
destekB = Entry(root, textvariable = destek)
bosB = Entry(root, textvariable = bos)

algiB.grid(row=1, column=1, padx = 10, pady = 10)
bilgeB.grid(row=1, column=3, padx = 10, pady = 10)
duyguB.grid(row=2, column=1, padx = 10, pady = 10)
destekB.grid(row=3, column=1, padx = 10, pady = 10)
bosB.grid(row=4, column=1, padx = 10, pady = 10)

def kaydet():
girilen = [(None, algiB.get(), bilgeB.get(),
duyguB.get(), destekB.get(),
bosB.get(),)]
for yazi in girilen:
im.execute(“INSERT INTO ana VALUES (?,?,?,?,?,)”, yazi)
kaydet()

#Kaydet butonu
kaydet=Button()
kaydet = Button(text = “Kaydet”, command = kaydet)
kaydet.grid(row=6,column=2,padx = 20, pady = 20)

im.close()
vt.commit()
root.mainloop()

vt.close()

internette benzer sorular çok, ama etkili bir çözüme rastlayamadım. Yardım lütfen.

Kodunuzu lütfen ` arasına alın. Bu şekilde kodunuz daha okunabilir olacaktır. Ayrıca kodunuzdaki girintileri de görebileceğiz.
Bunu yapınca kodunuz bu şekilde görünecektir:

#blablabla
print("a")

"from tkinter import*
import sqlite3

vt = sqlite3.connect(‘deneme3.db’)
im = vt.cursor()

def create_table():
#im.execute(’’‘DROP TABLE IF EXISTS Archive’’’)
im.execute(""“CREATE TABLE IF NOT EXISTS ana(
Customer_Id INTEGER PRIMARY KEY,
algi TEXT,
bilge TEXT,
duygu TEXT,
destek TEXT,
bos TEXT)”"")

create_table()

root=Tk()
root.title=(‘Bilge İle Sohbet’)

algi = “”
bilge = “”
duygu = “”
destek = “”
bos = “”

#String tipleri
algi = Text()
bilge = Text()
duygu = Text()
destek = Text()
bos = Text()

#Etiketler
bLabel = Label(root, text="")
algiLabel = Label(root, text=“Algı”)
bilgeLabel = Label(root, text=“Bilge”)
duyguLabel = Label(root, text=“Duygu”)
destekLabel = Label(root, text=“Destek”)
bosLabel = Label(root, text=“Boş”)

bLabel.grid(row=0, column=0)
algiLabel.grid(row=1, column=0, padx = 10, pady = 10)
bilgeLabel.grid(row=1, column=2, padx = 10, pady = 10)
duyguLabel.grid(row=2, column=0, padx = 10, pady = 10)
destekLabel.grid(row=3, column=0, padx = 10, pady = 10)
bosLabel.grid(row=4, column=0, padx = 10, pady = 10)

#Entry alanları
algiB = Entry(root, textvariable = algi)
bilgeB = Entry(root, textvariable = bilge)
duyguB = Entry(root, textvariable = duygu)
destekB = Entry(root, textvariable = destek)
bosB = Entry(root, textvariable = bos)

algiB.grid(row=1, column=1, padx = 10, pady = 10)
bilgeB.grid(row=1, column=3, padx = 10, pady = 10)
duyguB.grid(row=2, column=1, padx = 10, pady = 10)
destekB.grid(row=3, column=1, padx = 10, pady = 10)
bosB.grid(row=4, column=1, padx = 10, pady = 10)

def kaydet():
girilen = [(None, algiB.get(), bilgeB.get(),
duyguB.get(), destekB.get(),
bosB.get(),)]
for yazi in girilen:
im.execute(“INSERT INTO ana VALUES (?,?,?,?,?,)”, yazi)
kaydet()

#Kaydet butonu
kaydet=Button()
kaydet = Button(text = “Kaydet”, command = kaydet)
kaydet.grid(row=6,column=2,padx = 20, pady = 20)

im.close()
vt.commit()
root.mainloop()

vt.close()"

Tırnak işareti değil :smiley:
` işaretinden kodunuzun en başına ve en altına koysanız yeterli olacaktır :slight_smile:
İsterseniz kopyalayın ya da ALT + Virgül (,) kombinasyonunu yaparsanız çıkacaktır.

`from tkinter import*
import sqlite3
vt = sqlite3.connect(‘deneme3.db’)
im = vt.cursor()
def create_table():
im.execute(“”“CREATE TABLE IF NOT EXISTS ana(
Customer_Id INTEGER PRIMARY KEY,
algi TEXT,
bilge TEXT,
duygu TEXT,
destek TEXT,
bos TEXT)”“”)
create_table()
root=Tk()
root.title=(‘Bilge İle Sohbet’)
algi = “”
bilge = “”
duygu = “”
destek = “”
bos = “”

string tipleri
algi = Text()
bilge = Text()
duygu = Text()
destek = Text()
bos = Text()

#Etiketler
bLabel = Label(root, text=“”)
algiLabel = Label(root, text=“Algı”)
bilgeLabel = Label(root, text=“Bilge”)
duyguLabel = Label(root, text=“Duygu”)
destekLabel = Label(root, text=“Destek”)
bosLabel = Label(root, text=“Boş”)
bLabel.grid(row=0, column=0)
algiLabel.grid(row=1, column=0, padx = 10, pady = 10)
bilgeLabel.grid(row=1, column=2, padx = 10, pady = 10)
duyguLabel.grid(row=2, column=0, padx = 10, pady = 10)
destekLabel.grid(row=3, column=0, padx = 10, pady = 10)
bosLabel.grid(row=4, column=0, padx = 10, pady = 10)

entry alanları
algiB = Entry(root, textvariable = algi)
bilgeB = Entry(root, textvariable = bilge)
duyguB = Entry(root, textvariable = duygu)
destekB = Entry(root, textvariable = destek)
bosB = Entry(root, textvariable = bos)
algiB.grid(row=1, column=1, padx = 10, pady = 10)
bilgeB.grid(row=1, column=3, padx = 10, pady = 10)
duyguB.grid(row=2, column=1, padx = 10, pady = 10)
destekB.grid(row=3, column=1, padx = 10, pady = 10)
bosB.grid(row=4, column=1, padx = 10, pady = 10)

def kaydet():
girilen = [(None, algiB.get(), bilgeB.get(),
duyguB.get(), destekB.get(),
bosB.get(),)]
for yazi in girilen:
im.execute(“INSERT INTO ana VALUES (?,?,?,?,?,)”, yazi)

kaydet()

#Kaydet butonu
kaydet=Button()
kaydet = Button(text = “Kaydet”, command = kaydet)
kaydet.grid(row=6,column=2,padx = 20, pady = 20)

im.close()
vt.commit()
root.mainloop()
vt.close() `

internette benzer sorular çok, ama etkili bir çözüme rastlayamadım. Yardım lütfen.

Tek çentik (`) değil, üç çentik (```) arasına almalısınız: Gönderilerdeki kod görünümü hakkında

Error sorununu çözdüm, ama şimdi tabloya kayıt yapamıyorum. Hata vermiyor ama kayıt da yapmıyor. Üç çentikile aşağıya kopyalıyorum. (Teşekkürler, yan ekranda ne istediğinizi gördüm sonunda.)

import sqlite3

vt = sqlite3.connect('deneme3.db')
im = vt.cursor()

def create_table():
    im.execute("""CREATE TABLE IF NOT EXISTS ana(
    Customer_Id INTEGER PRIMARY KEY,
    algi TEXT,
    bilge TEXT,
    duygu TEXT,
    destek TEXT,
    bos TEXT)""")

create_table()

root=Tk()
root.title=('Bilge İle Sohbet')
    

#String tipleri
algi = Text()
bilge = Text()
duygu = Text()
destek = Text()
bos = Text()
   
#Etiketler
Label0 = Label(root, text="")
Label1 = Label(root, text="Algı")
Label2 = Label(root, text="Bilge")
Label3 = Label(root, text="Duygu")
Label4 = Label(root, text="Destek")
Label5 = Label(root, text="Boş")

Label0.grid(row=0, column=0)
Label1.grid(row=1, column=0)
Label2.grid(row=2, column=0)
Label3.grid(row=3, column=0)
Label4.grid(row=4, column=0)
Label5.grid(row=5, column=0)
    

#Entry alanları
e1 = Entry(root,width=110)
eB = Entry(root,width=110)
e3 = Entry(root,width=110)
e4 = Entry(root,width=110)
e5 = Entry(root,width=110)

e1.grid(row=1, column=1,)
eB.grid(row=2, column=1,)
e3.grid(row=3, column=1,)
e4.grid(row=4, column=1,)
e5.grid(row=5, column=1,)

def kaydet():
    im.execute("%s\n%s\n%s\n%s\n%s" % (e1.get(),eB.get(),e3.get(),e4.get(),e5.get()))

kaydet()  

kaydet=Button()
kaydet = Button(text = "Kaydet", command = kaydet)
kaydet.grid(row=6,column=2,padx = 20, pady = 20)

im.close()
vt.commit()
root.mainloop()


vt.close()```

Bu kod bende çalışmadı. Ki zaten bu normal. Tk diye bir şey tanımlı değil ancak kullanılmış. Sizde nasıl çalıştı bu kod?

1 Beğeni

Kodu biraz düzenledim.

import sqlite3
from tkinter import *

vt = sqlite3.connect('deneme3.db')
im = vt.cursor()

def create_table():
    im.execute("""CREATE TABLE IF NOT EXISTS ana(
    Customer_Id INTEGER PRIMARY KEY,
    algi TEXT,
    bilge TEXT,
    duygu TEXT,
    destek TEXT,
    bos TEXT)""")

def on_closing():
    print("kapatılıyor...")
    im.close()
    vt.close()
    root.destroy()
    exit(0)
    
create_table()

root=Tk()
root.title=('Bilge İle Sohbet')
root.protocol("WM_DELETE_WINDOW", on_closing) 

#String tipleri
algi = Text()
bilge = Text()
duygu = Text()
destek = Text()
bos = Text()
   
#Etiketler
Label0 = Label(root, text="")
Label1 = Label(root, text="Algı")
Label2 = Label(root, text="Bilge")
Label3 = Label(root, text="Duygu")
Label4 = Label(root, text="Destek")
Label5 = Label(root, text="Boş")

Label0.grid(row=0, column=0)
Label1.grid(row=1, column=0)
Label2.grid(row=2, column=0)
Label3.grid(row=3, column=0)
Label4.grid(row=4, column=0)
Label5.grid(row=5, column=0)
    

#Entry alanları
e1 = Entry(root,width=110)
eB = Entry(root,width=110)
e3 = Entry(root,width=110)
e4 = Entry(root,width=110)
e5 = Entry(root,width=110)

e1.grid(row=1, column=1,)
eB.grid(row=2, column=1,)
e3.grid(row=3, column=1,)
e4.grid(row=4, column=1,)
e5.grid(row=5, column=1,)

def kaydet():
    im.execute("INSERT INTO ana(algi,bilge,duygu,destek,bos) VALUES(?,?,?,?,?)",(e1.get(),eB.get(),e3.get(),e4.get(),e5.get()))
    print("Kaydedildi")
    vt.commit()
    

kaydetButon = Button()
kaydetButon = Button(text = "Kaydet", command = kaydet)
kaydetButon.grid(row=6,column=2,padx = 20, pady = 20)

root.mainloop()

Kodunuzda, tabloya ekleme kısmında bir hata var. Yani bir SQL veritabanına kayıt yapılırken INSERT INTO tablo_adi kullanılır. ID’ye ekleme yapmadan, sadece diğer 5 sütuna kayıt eklemek için bu sütunların adını veriyoruz

INSERT INTO ana(algi,bilge,duygu,destek,bos)

Ayrıca kodunuza şu kısmı ekledim

def on_closing():
    print("kapatılıyor...")
    im.close()
    vt.close()
    root.destroy()
    exit(0)

root.protocol("WM_DELETE_WINDOW", on_closing) 

Çarpı tuşuna basıldığı zaman on_closing fonksiyonu çalışır. Böylece veritabanı ve sorgu çalıştırıcıyı kapatmayı garanti altına almış oluruz. Program içinde bir yerde bunları kapatırsanız, tekrar kullanamazsınız. Bu yüzden çıkışta kapattık.

Veritabanına kayıt yaparken %s formatı değil de, ? formatı kullanırsanız daha iyi olur. Böylece SQL injection denilen açığa neden olmamış olursunuz.

imlec.execute("INSERT INTO aaa VALUES(?,?)","veri1","veri2")

Son olarak, kodunuzda şöyle bir kısım vardı

def kaydet():
    im.execute("%s\n%s\n%s\n%s\n%s" % (e1.get(),eB.get(),e3.get(),e4.get(),e5.get()))

kaydet=Button()
kaydet = Button(text = "Kaydet", command = kaydet)

Hem buton adı kaydet, hem de fonksiyon adı kaydet olunca, kaydetme fonksiyonuna geçiş yapılmıyordu. Ben de bunların ismini değiştirdim.

İyi forumlar :slight_smile:

2 Beğeni

Tk(), tkinter içinde bir sınıf olarak tarif ediliyor, örneklerden aldım ve ne işe yaradığını bilmeden kullanıyorum. Bende çalışıyor, belki versiyon farkı olabilir mi? Python 3.7 kullanıyorum. (python kılavuzu s.761). Burada tkinter.Tk() şeklinde öneriliyor, ama bazı denemelerimde sorun yaşadım, bulduğum bazı örneklerde yalnızca Tk() şeklinde kullanılıyordu ve işime yaradı.
İlginize teşekkürler.

Çok teşekkür ederim, çözüldü. (“INSERT INTO…”) kısmını elbette kullanıyordum, ama o kadar çok deneme, kopyalama-yapıştırma ve silip yeniden yazma yaptım ki, son halinde gözümden kaçmış. Elbette çalışmaz, başka bir sorun olmasa bile. Fena halde utandım görünce.

1 Beğeni

Yok estağfurullah, utanacak birşey yapmadınız. Olabilir herkes hata yapıyor, normaldir bunlar.

Rica ederim, sorun çözüldüyse ne mutlu bana :slight_smile:

2 Beğeni

Tk’yı kullanmışsınız ancak içeri aktarmamışsınız. Yukarıdaki koddaki sorun buydu.

1 Beğeni

Bu gibi sorunlardan kaçınmak için göndereceğiniz kodun çalıştığına emin olmanızı öneririm. Mesela ben bunun için öncelikle kodu çalıştırıyorum, eğer çalışmasında sorun yoksa kopyalayıp yapıştırıyorum.

1 Beğeni

Uyarılarınız için çok teşekkür ederim, dikkat edeceğim.

2 Beğeni