Otomatik olarak tkinter Entry oluşturmak

Mrb arkadaşlar while döngüsü kullanarak 1 den 5 e kadar e1,e2,e3,e4,e5 adlarında otamatik olarak entry oluşturmak istiyorum nasıl yapabilirim?

İsterseniz kodlarınızı buraya yazın, onun üzerinden göstermeye çalışalım.

For döngüsü ve exec fonksiyonunu kullanın. Fakat bir yerde patlayacağı için farklı yöntemlere yönelmelisiniz. Mesela değişkenlere isim vermeden bir liste içine atıp listeden ulaşmak. Mesela bir sözlük kullanmak.

exec()'i neden kullanması gerekiyor?

Temelde şu işlemi yapmaya çalışıyor arkadaş.

import tkinter as tk

root = tk.Tk()


def entry(n):
    i = 0
    while i < n:
        entry = tk.Entry(root)
        entry.pack()
        i += 1
        yield entry


e1, e2, e3, e4, e5 = entry(5)
root.mainloop()

Entry sayısını 5’ten 5000’e çıkarması gerekirse tek yapması gereken bir ifadeyi değiştirmek.

import tkinter as tk

root = tk.Tk()

for i in range(1,6): # 6=>5001
    exec(f"e{i} = tk.Entry(root)")
    exec(f"e{i}.pack()")

root.mainloop()

Ama hâlâ bu yöntemi önermiyorum. 5 Entry olduğu sürece sizinki daha mantıklı.

Buradaki asil soru neden e1, e2, … adlarinda entry olusturmak isteniyor. (Ikinci soru da neden spesifik olarak while loop kullanilmasi, ama onun ornek oldugunu varsayiyorum.)

OP’nin derdi muhtemelen dinamik olarak n tane Entry yaratmak ve XY problemi olmus.

Hmm, evet yazdığınız koda bakınca bu da olur diye düşündüm. Ama entry’yi tutan değişkenlere ulaşmak sıkıntı burada, o kısmı düzenlemek gerekiyor.

Şöyle de yapılabilir:

import tkinter as tk

root = tk.Tk()

entries = lambda n: list(map(lambda i: tk.Entry(root).pack(), range(n)))
entries(10)

root.mainloop()

Nedir?

XY problemi, asıl problem yerine denediğiniz çözüm hakkında soru sormaktır. Bu, hem yardım isteyen, hem de yardım sağlayanlar tarafında çok fazla zaman ve enerji harcanmasına sebep olmaktadır. Kısaca:

Kullanıcı X yapmak istiyor.
Kullanıcı X’i nasıl yapacağını bilmiyor ama Y’yi yapmayı başarabilirse bir çözüm yoluna girebileceğini düşünüyor.
Kullanıcı Y’yi nasıl yapacağını da bilmiyor.
Kullanıcı Y hakkında yardım istiyor.
Başkaları kullanıcıya Y ile ilgili yardım etmeye çalışıyor ama kafaları karışmış çünkü Y çözmek istemek için garip bir sorun gibi görünüyor.
Bir sürü etkileşim ve harcanan zamandan sonra kullanıcının aslında X için yardım istediği, Y’nin X için uygun bir çözüm bile olmadığı anlaşılıyor.

Bu sorun, insanların inandıkları şeyin çözüm olduğu konusunda takılıp kalmaları ve geri adım atıp konuyu tam olarak anlatamamaları halinde ortaya çıkar.

Bu konuda ne yapmalı?

Denediğiniz çözüme ek olarak mutlaka aslında hangi problemi çözmeye çalıstığınıza dair bilgiyi de her zaman ekleyin.
Eğer birileri daha fazla bilgi isterse detayları mutlaka sağlayın.
Daha önce gözardı ettiğiniz başka çözümler varsa, neden onları gözardı ettiğinizi paylaşın. Bu, gereksinimleriniz hakkında daha fazla bilgi verir.

Unutmayın, çözüme dair teorileriniz doğru olsaydı zaten en baştan yardım istemeyecektiniz, değil mi?

Bu bir liste oluşturur. İki çözümden de mantıklıdır.

Arkadaşlar çok tşk ederim, hepsini deneyeceğim zanndersem anladım.
amacım toplam ücreti taksit sayısına bölüp taksit sayısı kadar Entry oluşturmaktı. Selametle…

Mrb arkadaşlar kodları inceledim, Hasser arkadaşımızın gönderdiği kodda entry çiziliyor ve aynı zamanda entry değişkenlerine ulaşabiliyorum. Dildeolupbiten arkadaşımızın yazdığı kodda entry oluşturuluyor fakat değişkenlerine ulaşamıyorum. Entry değişkenlerinin liste içerisinde tutulması ise güzel fikir.
Benim yapmak istediğim ise combox(değerleri 1 ile 15 arasındaki sayı) oluşturup seçilen değere göre entry oluşturmak.
örnek: combobox 10 seçildiğinde 10 adet entry oluşturmak , combox değerini 5 olarak değiştirdiğimde ise ekranda sadece 5 adet entry oluşturmasını istiyorum.(Daha önce oluşturulan 10 adet entry nin 5 ini silmiyor) . Tşkler…

@cekirdek

Rica etsem aşağıdaki betiği hem okur hem de çalıştırır mısınız?

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import tkinter as tk

root = tk.Tk()
      
# Aşağıdaki fonksiyonla listedeki entryler None değerini alıyor, 
# entrylere ulaşılamıyor.    
f1 = lambda n: list(map(lambda i: tk.Entry(root).pack(), range(n)))
_f1 = f1(5)
for i in _f1:
    print(i)
# None
# None
# None
# None
# None
# 5 adet None değeri elde ettik.
# Aşağıda daha farklı bir fonksiyon tanımlanmıştır.
# Bu fonksiyona dikkat edin lütfen.
def f2(n):
    for i in range(n):
        entry = tk.Entry(root)
        entry.pack()
        yield entry
    

# f2 fonksiyonuyla widget oluşturalım.
_f2 = f2(5)
for i in _f2:
    print(i)
# Bu sefer aşağıdaki gibi bir çıktı almamız lazım.
# .!entry6
# .!entry7
# .!entry8
# .!entry9
# .!entry10

# Aşağıdaki fonksiyonla da yine çok sayıda widget 
# oluşturabiliriz.
def f3(n):
    entries = []
    for i in range(n):
        entry = tk.Entry(root)
        entry.pack()
        entries.append(entry)
    return entries
    
    
_f3 = f3(5)
for i in _f3:
    print(i)
# .!entry11
# .!entry12
# .!entry13
# .!entry14
# .!entry15


# Peki f1(n) fonksiyonu neden None değeri üretiyor, yanılmıyorsam
# tk.Entry(root).pack() yazım şeklinden kaynaklanan bir durum bu.
# Örneğin yukarıdaki fonksiyonları daha farklı yazalım:
# f2'ye benzer bir f4 fonksiyonu:
def f4(n):
    for i in range(n):
        yield tk.Entry(root).pack()


# f3'e benzer bir f5 fonksiyonu:
def f5(n):
    entries = []
    for i in range(n):
        entries.append(tk.Entry(root).pack())
    return entries
    
  
# Ve her iki fonksiyondan 5'er tane daha widget oluşturalım.
_f4, _f5 = f4(5), f5(5)
for i, j in zip(_f4, _f5):
    print(i, j)
# Aşağıdaki gibi bir çıktı elde edeceğiz.   
# None None
# None None
# None None
# None None
# None None

root.mainloop()
from tkinter import ttk
import tkinter as tk

root = tk.Tk()

create_entry = lambda n: list(map(lambda i: tk.Entry(root), range(n)))
entries = create_entry(15)

pack_entry = lambda n: map(lambda i: entries[i].pack(), range(n))
packed_entries = 0
pack_forget_entry = lambda n: map(lambda i: entries[i].pack_forget(), range(n))


def combobox_click(event, packed_entries=packed_entries):
    combobox = event.widget
    pack_forget_entry(packed_entries)
    n = int(combobox.get())-1
    pack_entry(n)
    packed_entries = n


combobox = ttk.Combobox(root, values=list(map(lambda i: str(i), range(1,16))))
combobox.bind("<<ComboboxSelected>>", combobox_click)
combobox.pack()

root.mainloop()

Kodlar böyle fakat işlevini görmüyor. Çalıştırınca anlarsınız.

return veya yield kullanmadığın için olabilir mi?

bu arada Hasser ve Dildeolupbiten kardeşlerim emeğinize sağlık kodları inceliyorum…

Mrb arkdaşlar frame oluşturarak istediğim şekilde entry alanı oluşturdum. Yöntem basit ama işimi görüyor.

from tkinter import ttk
class test():
    def __init__(self,master):
        self.master=master
        self.master.geometry("600x900")
        
        self.ilk=Entry(self.master)
        self.ilk.place(x=13,y=40)
        self.kombo=ttk.Combobox(self.master, values=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],state='readonly',width=3)
        self.kombo.place(x=160,y=40)
        self.kombo.current(0)
        self.buton=Button(self.master,text="Oluştur",command=self.olustur)
        self.buton.place(x=210,y=38)
    def frmciz(self):
        self.frm=LabelFrame(self.master,border=0)
        self.frm.place(x=10,y=65,width=150,height=360)
    def frmsil(self):
        self.frmciz()
        self.cerceve.destroy()
    def olustur(self):
        self.a=self.kombo.current()+1
        self.frmciz()
        for i in range(1,self.a): # 6=>5001
            exec(f"self.e{i} = Entry(self.frm)")
            exec(f"self.e{i}.place(x=1,y=i*25-25)")

root = Tk()
gui=test(root)
root.mainloop()

Lütfen şu başlığı da bir inceler misiniz?