用按钮选择列表框项(tkinter)

2024-06-28 19:59:00 发布

您现在位置:Python中文网/ 问答频道 /正文

当我点击listbox中的每一个条目时,就会打印出一个文本,它来自应用程序Textbox小部件中的db。我想用我的按钮也能做到这一点。我的意思是,当用户在entrybox中搜索单词时,列表会降低到1个条目,我希望能够用3种方式选择该条目(在列表中单击它,单击我的按钮,按键盘上的Return键)。现在点击就可以了。我应该如何在enter_meansing函数中配置按钮事件?在

import sqlite3 as sqlite
import tkinter as tk
from tkinter import ttk


# GUI Widgets

class EsperantoDict:
def __init__(self, master):

    self.search_var = tk.StringVar()
    self.search_var.trace("w", lambda name, index, mode: self.update_list())

    self.frame_header = ttk.Frame(master, relief=tk.FLAT)
    self.frame_header.config(style="TFrame")
    self.frame_header.pack(side=tk.TOP, padx=5, pady=5)

    ttk.Label(self.frame_header, image=self.small_logo).grid(row=0, column=0, stick="ne", padx=5, pady=5, rowspan=2)
    ttk.Label(self.frame_header, text='EsperantoDict', font=('Arial', 18, 'bold')).grid(row=0, column=1)

    self.frame_content = ttk.Frame(master)
    self.frame_content.config(style="TFrame")
    self.frame_content.pack()

    self.entry_search = ttk.Entry(self.frame_content, textvariable=self.search_var, width=30)
    self.entry_search.bind('<FocusIn>', self.entry_delete)
    self.entry_search.bind('<FocusOut>', self.entry_insert)
    self.entry_search.grid(row=0, column=0, padx=5)
    self.entry_search.focus()
    self.entry_search.bind("<KeyRelease>", self.edit_input)

    self.button_search = ttk.Button(self.frame_content, text=u"Serĉu", command=self.enter_meaning)
    self.photo_search = tk.PhotoImage(file=r'C:\EsperantoDict\search.png')
    self.small_photo_search = self.photo_search.subsample(3, 3)
    self.button_search.config(image=self.small_photo_search, compound=tk.LEFT, style="TButton")
    self.button_search.grid(row=0, column=2, columnspan=1, sticky='nw', padx=5)
    self.button_search.bind('<Return>')

    self.listbox = tk.Listbox(self.frame_content, height=30, width=30)
    self.listbox.grid(row=1, column=0, padx=5)
    self.scrollbar = ttk.Scrollbar(self.frame_content, orient=tk.VERTICAL, command=self.listbox.yview)
    self.scrollbar.grid(row=1, column=1, sticky='nsw')
    self.listbox.config(yscrollcommand=self.scrollbar.set)
    self.listbox.bind('<<ListboxSelect>>', self.enter_meaning)

    self.textbox = tk.Text(self.frame_content, relief=tk.GROOVE, width=60, height=30, borderwidth=2)
    self.textbox.config(wrap='word')
    self.textbox.grid(row=1, column=2, sticky='w', padx=5)

    # SQLite
    self.db = sqlite.connect(r'C:\EsperantoDict\test.db')
    self.cur = self.db.cursor()
    self.cur.execute("SELECT Esperanto FROM Words ORDER BY Esperanto")
    for row in self.cur:
        self.listbox.insert(tk.END, row)
        self.update_list()

def update_list(self):
    self.listbox.delete(0, tk.END)
    search_term = self.search_var.get().lower()
    if search_term == 'type to search':
        search_term = ''
    self.cur.execute("SELECT Esperanto FROM Words WHERE LOWER(Esperanto) LIKE ? ORDER BY Esperanto",
                     ('%' + search_term + '%',))
    for row in self.cur:
        item = row[0]
        self.listbox.insert(tk.END, item)
    for row in range(0, self.listbox.size(), 2):
        self.listbox.itemconfigure(row, background="#f0f0ff")

def edit_input(self, tag):
    word_to_esp = {'gx': 'ĝ', 'cx': 'ĉ', 'hx': 'ĥ', 'jx': 'ĵ', 'ux': 'ŭ', 'sx': 'ŝ'}
    user_input = self.entry_search.get()
    user_input = user_input.lower()
    for i in word_to_esp:
        if user_input.__contains__(i):
            a = user_input.replace(i, word_to_esp[i])
            return self.search_var.set(a)

def enter_meaning(self, tag=None):
        index = self.listbox.curselection()
        esperanto = self.listbox.get(index)
        results = self.cur.execute("SELECT English FROM Words WHERE Esperanto = ?", (esperanto,))
        for row in results:
            self.textbox.delete(1.0, tk.END)
            self.textbox.insert(tk.END, row[0])

def entry_delete(self, tag):
    if self.entry_search.get():
        self.entry_search.delete(0, tk.END)
        self.textbox.delete(1.0, tk.END)
    return None

def entry_insert(self, tag):
    if self.entry_search.get() == '':
        self.entry_search.insert(0, "Type to Search")
    return None


def main():
root = tk.Tk()
EsperantoDict(root)
root.mainloop()


if __name__ == '__main__': main()

# db tbl name: Words
# db first field name: Esperanto
# db second field name: English

Tags: selfinputdbsearchdefcolumncontentframe