Membuat Bilah Pencarian dengan fungsionalitas berjenjang dengan Python

Saya bertanya-tanya apakah mungkin membuat bilah pencarian dengan fungsi berjenjang menggunakan widget entri di tkinter atau apakah ada widget lain yang dapat digunakan untuk mencapai tujuan ini, sepanjang waktu saya dalam pengembangan aplikasi desktop saya hanya bisa untuk membuatnya di mana Anda harus mengetikkan nama lengkap dari apa yang ingin Anda cari, lalu Anda akan menulis kueri yang mendapatkan entri dan mendapatkan informasi apa pun yang Anda inginkan dari database, ini sangat penting bagi saya karena itu membatasi saya, terutama ketika saya ingin membuat aplikasi untuk toko yang memiliki banyak item, Anda cukup mengetikkan huruf pertama dari suatu item dan secara otomatis menampilkan item dengan huruf pertama tersebut. tolong saya akan sangat menghargai jika ada jawaban untuk ini...


person Oden Ikpi David    schedule 15.08.2019    source sumber
comment
Mungkin widget AutocompleteCombobox di modul ttkwidget dapat melakukan apa yang Anda inginkan.   -  person j_4321    schedule 15.08.2019
comment
terima kasih, ini bukan yang saya cari tetapi itu akan berhasil @j_4321   -  person Oden Ikpi David    schedule 19.08.2019


Jawaban (1)


Yang perlu Anda lakukan hanyalah mengikat fungsi pada <Any-KeyRelease> untuk memfilter data saat pengguna mengetik. Saat fungsi terikat dipanggil, dapatkan nilai widget entri lalu gunakan itu untuk mendapatkan daftar nilai yang difilter.

Berikut adalah contoh yang menggunakan kumpulan data tetap dan kotak daftar untuk menampilkan data, namun tentu saja Anda dapat dengan mudah melakukan kueri database dan menampilkan nilainya sesuai keinginan Anda.

import tkinter as tk

# A list of all tkinter widget class names
VALUES = [cls.__name__ for cls in tk.Widget.__subclasses__()]

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.entry = tk.Entry(self.root)
        self.listbox = tk.Listbox(self.root)
        self.vsb = tk.Scrollbar(self.root, command=self.listbox.yview)
        self.listbox.configure(yscrollcommand=self.vsb.set)

        self.entry.pack(side="top", fill="x")
        self.vsb.pack(side="right", fill="y")
        self.listbox.pack(side="bottom", fill="both", expand=True)

        self.entry.bind("<Any-KeyRelease>", self.filter)

        self.filter()

    def filter(self, event=None):
        pattern = self.entry.get().lower()
        self.listbox.delete(0, "end")
        filtered = [value for value in VALUES if value.lower().startswith(pattern)]
        self.listbox.insert("end", *filtered)

example = Example()
tk.mainloop()
person Bryan Oakley    schedule 15.08.2019