Treeview sütununa Entry eklemek

Merhaba iyi çalışmalar hepinize,
Tkinter ile oluşturduğum basit bir arayüze tablo eklemeyi düşünüyorum. Ancak tablomun bir sütunun tamamen Entry'lerden oluşması gerekli sonrasında bu Entry'lere girilen değerleri alıp kullanmam değiştirmem belli if-else yapıları içinde kullanmam gerek. Tabloyu ilk başta tuple ile tablo oluşturdum bir for döngüsü ile bellirli bir sütunun tüm satırlarına Entry ekledim ancak bildiğim kadarıyla tuple yapısında sonradan herhangi bir veri ekleme silme yada değiştirme yapılmıyor bu nedenle Treeview üzerine nasıl entry ekleyebilirim ?

Merhaba,

Tam olarak sorduğunuz sorunun cevabını net olarak veremiyorum fakat cevabı bulma ihtimaliniz olduğunu düşündüğüm bir çözüm süreci var.

Üstteki linkte treeview ile yapılmış güzel bir çalışma var. Bu çalışma içerisindeki tablonun oluştuğu kısımlara göz atın. Daha sonra Entry() yerleştirmeyi deneyin. Olursa bizimle de paylaşın olmazsa da hal çaresine bakalım tekrardan

siparis.py > Yardım > Forum > istihza.com

Burayı YazBel olarak değiştirebiliyor muyuz?

Repository bizim degil.

Teşekkür ederim inceledim ama sanırım bu benim için pek işe yarar bir örnek değil yaratmak istediğim şey mesela;
ilk sütünda 1’den 30’a kadar satır numaraları var,
bir sonra ki sütunda açıklamalar var örneğin ad, soyad, yaş, cinsiyet, boy, kilo gibi
üçüncü sütunda bunların min değeri
dördüncü sütunda bunların max değerleri
son sütunda da kullanıcıdan değer alabileceğim alanlar olmalı
Treeview yerine başka kullanabileceğim önerilerinize de açığım açıkçası

Şu an için elimden gelen başka bir şey yok :frowning: olursa yazarım bende araştıracağım.

Neyin max ve min değerlerinden bahsediyorsunuz? Yaşın mı, boyun mu, kilonun mu?

Entriler ile kendi tablonuzu oluşturabilirsiniz. Ama önce nasıl bir şey oluşturmak istediğinizi anlamamız lazım, basit bir şekilde bize tablo üzerinde gösterebilir misiniz?

@doga

Excel de tablonuzu görseller ile oluşturup daha sonra ekran fotoğrafı alıp buraya atabilir misiniz?

Yazılı olarak bize anlatmaktansa görsel olarak anlatacak olmanız daha güzel olur. Çünkü her zaman sizin zihninizde hayal ettiğinizi tam anlamıyla kendi zihnimizde hayal edemeyebiliriz. Ama görsel olarak gördüğümüz de zihnimizde işlenir.

Merhaba tekrar anlatmak istediğime yakın bir görseli excel’de oluşturdum oldukça çirkin oldu ama anlatabilmişimdir umarım. Ben Bunu Python ile yapmaya çalışırken 3 parça için (turuncu-mavi-beyaz) 3 ayrı Canvas oluşturdum. daha sonra turuncu alanlara 6 tane resimli buton ekledim. Mavi alana bir kaç yazı yazdım buraya kadar herhangi bir sıkıntım yok. En alta oluşturmak istediğim tabloyuda oluşturdum ancak son sütunda bu parametreler için kullanıcıdan değer almam gerek. Anket formu gibi düşünün hepsini kendine göre doldurup sonra butonlardan biri ile onaylaması gerek yada belirttiğim min-max aralığında değer girmemişse yada alanların tamamını doldurmadıysa uyarı vericem gibi. (Resimde ki görsel gösterebilmem amaçlı tamamen uydurulmuş yazılar ve ikon şekilleridir.)

dene

yani şöyle bir şey işini görmez mi?

from tkinter import *

pencere = Tk()
pencere.geometry("+1000+1000")
pencere.title("DENEME")
pencere.resizable(FALSE, FALSE)

xetiket1 = Label(pencere, text="Parametreler")
xetiket1.grid(row=0, column=0)

xetiket2 = Label(pencere, text="Açıklamalar")
xetiket2.grid(row=0, column=1)

xetiket3 = Label(pencere, text="Min Değerleri")
xetiket3.grid(row=0, column=3)

xetiket4 = Label(pencere, text="Max Değerleri")
xetiket4.grid(row=0, column=4)

xetiket5 = Label(pencere, text="Önerilen")
xetiket5.grid(row=0, column=5)

xetiket6 = Label(pencere, text="Kullanıcı Girişi")
xetiket6.grid(row=0, column=6)

etiket1 = Label(pencere, text="A1")
etiket1.grid(row=1, column=0

etiket2 = Label(pencere, text="yaş")
etiket2.grid(row=1, column=1)

etiket3 = Label(pencere, text="1")
etiket3.grid(row=1, column=3)

etiket4 = Label(pencere, text="80")
etiket4.grid(row=1, column=4)

etiket5 = Label(pencere, text="5")
etiket5.grid(row=1, column=5)

girdi1 = Entry()
girdi1.grid(row=1, column=6)

mainloop()

Hata verebilir ya da vermeyebilir emin değilim çünkü çalıştırma imkanım yok şuan bu kodu. çok uzun oldu bunların oluşması for döngüsü ile birkaç satılrık kod ile daha basitçe üretilebilir tüm tablo. Görsel olarak pek bir etki göstermeyecektir onlar da halledilebilir.

Tabi eğer işini görecek bir kıvamdaysa. Bi çalıştır bakalım ne olacak.

Aşağıdaki gibi bir program işinizi görüyor mu?

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

import tkinter as tk

from tkinter import ttk
from tkinter.messagebox import showwarning, showinfo


class Table(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pack()
        self.user_entries = []
        self.style = ttk.Style()
        self.style.map(
            "TEntry",
            fieldbackground=[("readonly", "white")]
        )
        self.data = {
            "Parametreler": [f"A{i}" for i in range(1, 5)],
            "Açıklamalar": ["Yaş", "Boy", "Kilo", "Ayak Numarası"],
            "Min Değerleri": [1, 0, 2, 1],
            "Max Değerleri": [80, 100, 12, 67],
            "Önerilen": [5, 50, 8, 52]
        }
        self.frame = tk.Frame(master=self)
        self.frame.pack()
        self.button = tk.Button(
            master=self, 
            text="Tamam", 
            command=self.command
        )
        self.button.pack()
        self.create()
        self.create_user_entry()
        
    
    def create(self):
        for column, (key, value) in enumerate(self.data.items()):
            label = tk.Label(master=self.frame, text=key)
            label.grid(row=0, column=column)
            for row, item in enumerate(value):
                entry = ttk.Entry(master=self.frame, style="TEntry")
                entry.grid(row=row + 1, column=column)
                entry.insert("insert", item)
                entry["state"] = "readonly"
    
    def create_user_entry(self):
        column = tk.Label(master=self.frame, text="Kullanıcı Girişi")
        column.grid(row=0, column=len(self.data))
        for row in range(len(self.data["Parametreler"])):
            cell = ttk.Entry(master=self.frame, style=f"{row}.TEntry")
            cell.grid(row=row + 1, column=len(self.data)) 
            cell.bind(
                "<KeyRelease>", 
                lambda event, row=row, widget=cell: self.control(
                    widget=widget, 
                    row=row
                )
            )
            self.user_entries.append(cell)
            
    def control(self, widget, row):
        minimum = self.data["Min Değerleri"][row]
        maximum = self.data["Max Değerleri"][row]
        try:            
            if int(widget.get()) not in range(minimum, maximum + 1):
                self.style.configure(
                    f"{row}.TEntry", 
                    fieldbackground="red"
                )
            else:
                self.style.configure(
                    f"{row}.TEntry", 
                    fieldbackground="white"
                )
                return True            
        except ValueError:
            self.style.configure(
                f"{row}.TEntry", 
                fieldbackground="red"
            )
        return False
            
    def command(self):
        check = [
            self.control(row=i, widget=entry) 
            for i, entry in enumerate(self.user_entries)
        ]
        if all(check):
            showinfo(
                title="Bilgi",
                message="Kutulara istenen değerleri girdiniz!"
            )
        else:
            showwarning(
                title="Uyarı", 
                message="Kutulara istenen değerleri girmediniz!"
            )
         
         
if __name__ == "__main__":       
    root = tk.Tk()
    Table(master=root)
    root.mainloop()
1 Beğeni

şimdi çalıştırdım evet istediğim tam olarak böyle birşeydi kodunuzu nasıl yazdığınızı tek tek inceleyeceğim tekrar düzenleme yaparken sorum olursa tekrar yazabilir miyim açıkçası bu şekilde nesne tabanlı yazmak biraz zor benim için

Tabi, sorunuz olursa cevaplamaya çalışırız.

merhaba rahatsız ediyorum tekrar kusura bakmayın eğer zahmet olmazsa aynı kodu sınıfsız bir yapıyla paylaşmanız mümkün mü

Merhaba, aşağıdaki kodları inceleyin isterseniz.

import tkinter as tk

from tkinter import ttk
from tkinter.messagebox import showwarning, showinfo


def create(master, data):
    for column, (key, value) in enumerate(data.items()):
        label = tk.Label(master=master, text=key)
        label.grid(row=0, column=column)
        for row, item in enumerate(value):
            entry = ttk.Entry(master=master, style="TEntry")
            entry.grid(row=row + 1, column=column)
            entry.insert("insert", item)
            entry["state"] = "readonly"


def create_user_entry(master, data, style):
    user_entries = []
    column = tk.Label(master=master, text="Kullanıcı Girişi")
    column.grid(row=0, column=len(data))
    for row in range(len(data["Parametreler"])):
        cell = ttk.Entry(master=master, style=f"{row}.TEntry")
        cell.grid(row=row + 1, column=len(data)) 
        cell.bind(
            "<KeyRelease>", 
            lambda event, row=row, widget=cell: control(
                data=data,
                widget=widget, 
                row=row,
                style=style
            )
        )
        user_entries.append(cell)
    return user_entries
        
        
def control(data, widget, row, style):
    minimum = data["Min Değerleri"][row]
    maximum = data["Max Değerleri"][row]
    try:            
        if int(widget.get()) not in range(minimum, maximum + 1):
            style.configure(
                f"{row}.TEntry", 
                fieldbackground="red"
            )
        else:
            style.configure(
                f"{row}.TEntry", 
                fieldbackground="white"
            )
            return True            
    except ValueError:
        style.configure(
            f"{row}.TEntry", 
            fieldbackground="red"
        )
    return False
        
        
def command(data, style, user_entries):
    check = [
        control(data=data, widget=entry, row=i, style=style) 
        for i, entry in enumerate(user_entries)
    ]
    if all(check):
        showinfo(
            title="Bilgi",
            message="Kutulara istenen değerleri girdiniz!"
        )
    else:
        showwarning(
            title="Uyarı", 
            message="Kutulara istenen değerleri girmediniz!"
        )
        
        
def main():
    root = tk.Tk()

    tablo = tk.Frame(master=root)
    tablo.pack()

    frame = tk.Frame(master=root)
    frame.pack()
    
    style = ttk.Style()
    style.map("TEntry", fieldbackground=[("readonly", "white")])
    
    data = {
        "Parametreler": [f"A{i}" for i in range(1, 5)],
        "Açıklamalar": ["Yaş", "Boy", "Kilo", "Ayak Numarası"],
        "Min Değerleri": [1, 0, 2, 1],
        "Max Değerleri": [80, 100, 12, 67],
        "Önerilen": [5, 50, 8, 52]
    }
    
    create(frame, data)
    user_entries = create_user_entry(frame, data, style)

    button = tk.Button(
        master=root, 
        text="Tamam", 
        command=lambda: command(data, style, user_entries)
    )
    button.pack()
    
    root.mainloop()


if __name__ == "__main__":       
    main()

çook teşekkür ederim zahmet verdim :slight_smile: , iyi çalışmalar

Rica ederim, size de iyi çalışmalar.