Tkinter Combobox içeriği yazılana göre filtrelemek

combobox’un içerisindeki verileri, isim seçerken tek tek gezmek zorunda kalıyorum . 3-5 isim oldugunda problem yok ama mesela bu isimleri bir veri kaynağından alsaydım 250 kadar isim olsaydı mesela “k” harfine bastıgımda comboboxun içerisindeki direk “k” harfi ile başlayan isimlerin olduğu yere gelebilmek istiyorum. Böyle bir fonksiyon var mı acaba combobox için ?

Ubuntudaki Tab işlevi gibi birşeymi arıyorsunuz ?

1 Beğeni

Zaten arama yapınca “key” tuşlarina hızlıca basınca kayitli olan “keyboard” yazisi çıkmıyor mu?

(Kelimeler örnektir)

1 Beğeni

Malesef Ubuntunu ve ubuntundaki tab işlevini bilmediğim için cevap veremiycem

form=tk.Tk()
form.title(“Corona Verileri”)
form.geometry(“500x400+500+400”)
form.config(bg=“pink”)

combobox=Combobox(form,value=ulkeler)
combobox.place(relx=0.1,rely=0.1,width=200)

form.mainloop()

https://prnt.sc/t1khop buradaki arayüzü yukardaki kodlarla oluşturdum. (ulkeler adlı liste veritabanından alınıyor .) Ekran görüntüsündeki yerde “T” bastıgımda Turkey veya “T” ile başlayan diğer ülkelere hızlıca gelmesini istiyorum. Yandaki barı çekerek değil. Şu ekranda şu kodlarla dediğimiz işlem olmuyor.

Çalışan bir kod örneği ve ülkeler listesini paylaşabilir misiniz?

1 Beğeni
import requests
import tkinter as tk
from tkinter.ttk import Combobox


ulkelerUrl="https://api.covid19api.com/countries"


ulkelerJson=requests.get(ulkelerUrl)
ulkelerPython=ulkelerJson.json()

ulkeler=[]

for x in range(0,len(ulkelerPython)):
    ulkeler.append(ulkelerPython[x]["Country"])
    
ulkeler.sort()
    
    




form=tk.Tk()
form.title("Corona Verileri")
form.geometry("500x400+500+400")
form.config(bg="pink")

combobox=Combobox(form,value=ulkeler)
combobox.place(relx=0.1,rely=0.1,width=200)



form.mainloop()

Kodlarınız ``` arasına alabilirsiniz:

```python
<kodlar buraya gelecek>
```

1 Beğeni

Şu işinizi görür mü:

import requests
import tkinter as tk
from tkinter.ttk import Combobox

ulkelerUrl="https://api.covid19api.com/countries"

ulkelerJson=requests.get(ulkelerUrl)
ulkelerPython=ulkelerJson.json()

ulkeler=[]

for x in range(0,len(ulkelerPython)):
    ulkeler.append(ulkelerPython[x]["Country"])

ulkeler.sort()

form=tk.Tk()
form.title("Corona Verileri")
form.geometry("500x400+500+400")
form.config(bg="pink")

def outo_change_on_input(combobox):
    original_values = combobox["value"]
    
    def update():
        text = combobox.get().lower()
        combobox["value"] = [i for i in original_values if i.lower().startswith(text)]     

    def callback(event):
        combobox.after(0, update)
        
    combobox.bind("<Key>", callback)


combobox = Combobox(form, value=ulkeler)
combobox.place(relx=0.1, rely=0.1, width=200)

outo_change_on_input(combobox)

form.mainloop()
1 Beğeni

çok teşekkürler :+1: :+1:

Gönderimi “Çözüm” olarak işaretleyebilirsiniz.

Tkinter biraz uğraştırıcı bir arayüz kütüphanesi, bunun gibi modern arayüzlerde bulunan özellikler istiyorsanız PyQt kullanmayı deneyebilirsiniz.

5 dakikalık bir araştırmada tkinter widget’lerinin bind’lendiği fonksiyonu çağırmadan önce event’i işlemesinin bir yolunu bulamadığım için combobox.after kullandım. Yoksa combobox.get bir karakter eksik döndürüyor.

combobox.bind("<Key>", callback) kısmı combobox üzerinde herhangi bir tuşa basıldığında callback fonksiyonunun çağırılmasını sağlıyor. callback'daki combobox.after(0, update)'nin sebebini yukarıda söyledim zaten. update fonksiyonu da combobox’daki elemanları filtreliyor.

2 Beğeni