Python'da tkinter ile listeleri pencereye yazdırmak

ben python ve sqlite3 kullanarak bir login ekranı yapıyorum.ama şöyle bir sorun var.Yeni kullanıcı oluşturma ve giriş yapma kısmını tamamladım ama kullanıcı silme işleminde takıldım yardım ederseniz sevinirim.öncelikle bir admin şifresi belirledim kullanıcı sil butonuna bastığında ondan admin şifresi isteniyor eğer şifreyi doğru girerse sqlite veri tabanımdaki user sütunundaki verileri pencere içine yanındada 1’den başlayıp numaralar yazmasını istiyorum yanındada bir entry ile ondan numarayı alıp sqlite3 deki rowid fonksiyonuyla o kullanıcının kaydolduğu satırı silmek istiyorum.

def deletek():
    Ap = str(admin_E.get())
    if Ap == admin_password:
        imlec.execute("SELECT user FROM base")
        f = imlec.fetchall()
        for i, j in enumerate(f, 1):
            x = "{}){} ".format(i, " ".join(j))
            print("{}".format(x))

    else:
        mesaj1 = Label(text="Yanlış şifre lütfen\ntekrar deneyiniz.")
        mesaj1.grid(row=4, column=1)

def delete():
    global admin1,admin_E,bt
    buton.destroy()
    buton1.destroy()
    buton2.destroy()

    admin1 = Label(text="Yönetici girişi yapınız :")
    admin1.grid(row=0, column=0)

    admin_E = Entry()
    admin_E.grid(row=0, column=1)

    bt = Button(text="Giriş",command=deletek)
    bt.grid(row=3,column=1)

pencere = Tk()
pencere.geometry("290x180")

buton = Button(pencere,
                text="Yeni Kullanıcı",command=new)
buton1 = Button(pencere,
                text="Giriş",command=login)
buton2 = Button(pencere,
                text="Kullanıcı Silme",command=delete)

buton.pack()
buton1.pack()
buton2.pack()

pencere.mainloop()

Eğer giriş yapma ve veri çekme kısmını hallettiyseniz:

from tkinter import *

root=Tk()
class deneme():
   def __init__(self,master):
       global liste
       liste=["kullanıcı1","kullanıcı2","kullanıcı3"]
       i=0
       while i<len(liste):
           self.label=Label(text=liste[i])
           self.label.grid(row=i,column=0)
           self.button=Button(text="sil" )
           self.button['command']=lambda yazi=liste[i], lbl=self.label,btn=self.button: self.sil(yazi,lbl,btn)
           self.button.grid(row=i,column=1)
           i+=1
   def sil(self,yazi,lbl,btn):
       liste.remove(yazi)
       print(liste)
       lbl.destroy()
       btn.destroy()
uyg = deneme(root)
root.mainloop()

bu şekilde verileri listeleyip silebilirsiniz.

hocam sqlite veri tabanımdan verileri çektiğim zaman liste halinde geliyor f değişkenine atayıp ekrana yazdırdığımda biraz değişik o yüzden enumerate ile kullanıcıların önüne 1’den başlayıp sayı atıyorum ve join fonksiyonu ile biraz düzenleyip ekrana yazdırdığımda string haline geliyor.

imlec.execute("SELECT user FROM base")
f = imlec.fetchall()
for k, j in enumerate(f, 1):
    x = "{}){} ".format(i, " ".join(j))"
    
    
print(f,type(f))
[('ahmet',), ('can',), ('can',)] <class 'list'>
[('ahmet',), ('can',), ('can',)] <class 'list'>
[('ahmet',), ('can',), ('can',)] <class 'list'>

print(x,type(x))
1)('ahmet',)  <class 'str'>
2)('can',)  <class 'str'>
3)('can',)  <class 'str'>

özür dilerim tam anlayamadım da tam olarak sorun nedir?

yani ben veri tabanımdan listemi çekip f değişkenine atıyorum. f değişkenini pencereye yanında 1’den başlayacak şekilde numaralandırıp yazdırmak istiyorum ve yanındada bir entry olsun istiyorum.kalanı ben hallederim.

from tkinter import *

root=Tk()

f=["kullanıcı1","kullanıcı2","kullanıcı3"]
i=0
while i<len(f):
   label=Label(text=str(i+1)+". "+f[i])
   label.grid(row=i,column=0)
   entry=Entry()
   entry.grid(row=i,column=1)
   i+=1

root.mainloop()

Hocam şöyle bir sorun var ben veri tabanımdan kullanıcılarımı çekip f değişkenine atadığımda ve f değişkenini yazdırdığımda şöyle bir çıktı veriyor.

#veritabanımdan çektiğim kullanıcılar
imlec.execute("SELECT user FROM base")
f = imlec.fetchall()
print(f)
#normal bir liste
f1 = ["ahmet","can"]
print(f1)

çıktı:

#benim veri tabanımdan çektiğim kullanıcıların çıktısı
[('ahmet',), ('can',)]
#normal listenin çıktısı
['ahmet', 'can']

yani veri tabanımdan kullanıcıları çektiğimde fazladan semboller var o yüzden tkinter ile yaptığım pencereye yerleştiremiyorum

>>> [('ahmet',), ('can',)][0]
('ahmet',)
>>> ('ahmet',)[0]
'ahmet'
>>>

yani çektiğiniz veri tuple formatında geliyormuş.

f=[('ahmet',), ('can',)]
e=[]
for i in f:
    e.append(i[0])
print(e)

bu şekilde yeni bir listeye atayıp daha önce yazdığım örnekteki gibi kullanabilirsiniz.

hocam teşekkürler oldu ama her kullanıcıyı numaralandırmak istiyorum. onu nasıl yaparım örneğin; ahmet kullanıcısının başında 1 can kullanıcısının başında 2 olsun ve bu her kullanıcı için olsun yani veri tabanımda 10 kullanıcı olduğunda 10’a kadar numaralandırılsın her kullanıcıyı.

f=[('ahmet',), ('can',),('mehmet',),('ali',)]
e=[]
for i in f:
    e.append(i[0])

i=0
while i<len(e):
   text=(str(i+1)+". "+e[i])
   print(text)
   i+=1