Python Tkinter ile kullanıcı verilerini başka bir yerde kullanmak istiyorum

Merhaba arkadaslar bir uygulama için uzun uzun yazdım ama hem kısa yolu var mı öğrenmek istiyorum hem de ilerleyen süreçte alternatifler büyüyebilir diye for veya başka döngü ile nasıl yapılır gösterebilir misiniz ?
Amacım kullanıcıdan 24veya x veri alıp , bunları bir matrise sokabilmek. for döngüsü ile yapmaya çalıştım ama get() turple ile calısmıyor uyarısı aldım. Önerileriniz var mı ? yoksa her seferinde girdi sayısı artarsa alt alta çoğaltmak zorunda mıyım ?

            A11_deger = float(a11.get())
            A12_deger = float(a12.get())
            A13_deger = float(a13.get())
            A14_deger = float(a14.get())
            A15_deger = float(a15.get())
            A16_deger = float(a16.get())
            A17_deger = float(a17.get())
            A18_deger = float(a18.get())
            A19_deger = float(a19.get())
            A110_deger = float(a110.get())
            A111_deger = float(a111.get())
            A112_deger = float(a112.get())

            A21_deger = float(a21.get())
            A22_deger = float(a22.get())
            A23_deger = float(a23.get())
            A24_deger = float(a24.get())
            A25_deger = float(a25.get())
            A26_deger = float(a26.get())
            A27_deger = float(a27.get())
            A28_deger = float(a28.get())
            A29_deger = float(a29.get())
            A210_deger = float(a210.get())
            A211_deger = float(a211.get())
            A212_deger = float(a212.get())
            evaluation = np.array(
                [[A11_deger, A12_deger, A13_deger, A14_deger, A15_deger, A16_deger, A17_deger, A18_deger, A19_deger,
                  A110_deger, A111_deger, A112_deger],
                 [A21_deger, A22_deger, A23_deger, A24_deger, A25_deger, A26_deger, A27_deger, A28_deger, A29_deger,
                  A210_deger, A211_deger, A212_deger]])
        a11 = Entry(content2, width=3)
        a11.place(x=100, y=100)
        a12 = Entry(content2, width=3)
        a12.place(x=130, y=100)
        a13 = Entry(content2, width=3)
        a13.place(x=160, y=100)
        a14 = Entry(content2, width=3)
        a14.place(x=190, y=100)
        a15 = Entry(content2, width=3)
        a15.place(x=220, y=100)
        a16 = Entry(content2, width=3)
        a16.place(x=250, y=100)
        a17 = Entry(content2, width=3)
        a17.place(x=280, y=100)
        a18 = Entry(content2, width=3)
        a18.place(x=310, y=100)
        a19 = Entry(content2, width=3)
        a19.place(x=340, y=100)
        a110 = Entry(content2, width=3)
        a110.place(x=370, y=100)
        a111 = Entry(content2, width=3)
        a111.place(x=400, y=100)
        a112 = Entry(content2, width=3)
        a112.place(x=430, y=100)

        a21 = Entry(content2, width=3)
        a21.place(x=100, y=130)
        a22 = Entry(content2, width=3)
        a22.place(x=130, y=130)
        a23 = Entry(content2, width=3)
        a23.place(x=160, y=130)
        a24 = Entry(content2, width=3)
        a24.place(x=190, y=130)
        a25 = Entry(content2, width=3)
        a25.place(x=220, y=130)
        a26 = Entry(content2, width=3)
        a26.place(x=250, y=130)
        a27 = Entry(content2, width=3)
        a27.place(x=280, y=130)
        a28 = Entry(content2, width=3)
        a28.place(x=310, y=130)
        a29 = Entry(content2, width=3)
        a29.place(x=340, y=130)
        a210 = Entry(content2, width=3)
        a210.place(x=370, y=130)
        a211 = Entry(content2, width=3)
        a211.place(x=400, y=130)
        a212 = Entry(content2, width=3)
        a212.place(x=430, y=130)

Matrix oluşturmak için şu fonksiyonu kullanabilirsin.

def list_to_matrix(self, l: list, col: int = 10):
    return [l[i : i + col] for i in range(0, len(l), col)]

Entry'leri for döngüsü ile oluşturup listede tut. Daha sonra işlem yapmak istediğini index numarasına göre çağır…

Şurada bir örnek bulabilirsin.

...
entry_list.append(Entry(content2, width=3))
...

https://github.com/beucismis/binaryclock/blob/master/binaryclock/clock.py#L47-L50

Tekrardan merhabalar ;
Sanırım benim acemiliğimden olsa gerek matrixte sorun yok onu halledebildim ama
hala Entry’leri for döngüsü ile beceremedim. Acaba attıgım kod icin örnek olması adına 3 satırını veya 2 satırını neyse sizlere kalmış bir döngü gösterebilir misiniz ?
listeye aldığı zaman get() fonksiyonunu kullanamıyorum
Bölümüm yazılım veya bilgisayar olmadığı halde , Çok kriterli karar verme tekniklerinden TOPSIS ile Alternatif sıralaması yapan bir uygulama yazmaya çalışıyorum. Tek tek yukarıda gösterdiğim şekilde ben tamamladım aslında, ama benim amacım algoritma olarak kendimi geliştirmek ve kodları kısaltmak, ama başaramıyorum…

a11, a12 … değerleri nereden geliyor? evaluation değişkenini nerede kullanıyorsunuz? content2 değişkenini ne? Kodunuzun tamamını atabilirseniz daha iyi yardımcı olurum. Kafamda soru işaretleri var.

Çok uzunsa paste servisi ile atabilirsin.

https://hastebin.com

tabi ki , kodlar biraz kötü olabilir kusura bakma lütfen dediğim gibi acemiyim , tkinteri 3 gün önce pythonı da öyle 2 3 aydır videolardan falan öğrendiğim kadarıyla biliyorum :slight_smile:

aşağıda personel2 , topsis, ve ana olarak bunları işleme sokan kodları haste bin ile kaydettim

https://hastebin.com/lowucuvole.bash
https://hastebin.com/imatoyebac.py
https://hastebin.com/agatavecon.rb

ben pek bilmediğim için personeller için ayrı ayrı classlar oluşturup oralardan aldım. Benim merak ettiğim kısım ise A1X şeklinde “Entry” girişlerini bir for döngüsüyle çekip TOPSIS için gerekli olan evaluation değişkeninde kullanabilmek

Örnek olması adına şunu da denedim ;

def listcagirici():
    listveri = list.get()
    print(listveri)
list = []
for i in range(2):
    list.append(Entry(root,name=str(i),width=3).pack())


d=Button(root,text="gör",command=listcagirici)

fakat şöyle bir hata aldım ;

  listveri = list.get()
AttributeError: 'list' object has no attribute 'get'

Aslında yaklaşmışsınız, bir-iki değişiklik yeter gibi:

list = []

  • Değişkenlerin isimlerini Python’daki halihazırda bulunan, rezerve edilmiş kelimelerden seçmemeye gayret etmek gerekir zira aksi takdirde Python’dakini “gölgelemiş” oluyoruz. Burada list diye bir değişken yazdığınızda Python’daki list artık fonksiyonunu kaybediyor ve sizin tanımladığınız listeye indirgeniyor. Bu, programın yanlış çalışmasına sebep olmayabilir ama “best practice” uğruna bundan kaçınmak gerekir. Mesela olur da Python’daki list’e işiniz düşerse, program hata verebilir. (Zaten editörünüz de list’i farklı renkle gösteriyordur belki, oradan da anlaşılabilir). Velhasıl, liste = [] tercih edilebilir.

list.append(Entry(root,name=str(i),width=3).pack())

  • Burada listeye eklediğiniz eleman neredeyse doğru; ama Tkinter ile geçmişi olan hatırısayılır sayıda kişinin şöyle ya da böyle düştüğü bir hata olan, AttributeError: ‘NoneType’ object has no attribute ‘get’ mesajına da gebe olan, Tkinter widget’ının tanımlanması ile yerleştirilmesi olaylarının bir çırpıda yapılmasını görüyoruz. Listenin içindekileri yazdırırsanız for döngüsünden sonra, [None, None] görürsünüz. Sebebine linkteki konudan ulaşırsınız (orada grid burada pack; temel mevzu aynı) ve şöyle düzeltirsiniz:
for i in range(2):
    bir_entry = Entry(root, name=str(i), width=3)
    bir_entry.pack()
    liste.append(bir_entry)

listveri = list.get()

  • Burada demek istediğiniz “şu listeye koyduğum Entry’lerin içerisindekileri tek tek al”; ama bunu direkt liste üzerinden yapmamız na-mümkün. Bir şekilde tek tek listenin elemanlarını dolaşmalıyız, for döngüsü bir yoldur:
for entry in liste:
    entry_nin_verisi = entry.get()
    print(entry_nin_verisi)

(list.append(Entry(root,name=str(i),width=3).pack()) olduğu gibi kalsaydı, bu adımda linkteki hatayı alırdık).

Çok teşekkür ederim :slight_smile: