python - 使用列表中的 tkinter ttk 组合框自动完成,列表是从 sqlite3 查询构建的
问题描述
我有一个创建 ttk 组合框的函数
def cb(x, sql_query, Var):
global comboBox
from tkinter import ttk
textfont = ("Helvetica", 14)
comboBox = ttk.Combobox(x, font=textfont, width=15, textvariable=Var)
comboBox.pack(anchor='e', pady=5)
update(sql_query)
# update items in list based on a sql query
def update(sql_query):
lis = []
lis.clear()
def query(*args, **kwargs):
nonlocal sql_query
import sqlite3
mydb = sqlite3.connect('Assets/backend/Data.db')
cursor = mydb.cursor()
cursor.execute(sql_query)
a = cursor.fetchall()
for i in a:
lis.append(i)
mydb.commit()
mydb.close()
query(lis)
comboBox['values'] = lis
现在,如果我有一个组合框供用户从中添加/获取项目,例如,他将开始输入 Burger。如果汉堡在项目表中,它将已经附加到设置组合框值的列表中,这很好用。我在这里无法实现的部分是设置自动完成,因此当用户开始输入时,如果项目存在,它将自动完成。我找到了一个代码,但我无法将其修改为我的场景我仍然不擅长上课
from tkinter import *
import sqlite3
from tkinter import ttk
class AutocompleteCombobox(ttk.Combobox):
def set_completion_list(self, completion_list):
"""Use our completion list as our drop down selection menu, arrows move through menu."""
self._completion_list = sorted(completion_list, key=str.lower) # Work with a sorted list
self._hits = []
self._hit_index = 0
self.position = 0
self.bind('<KeyRelease>', self.handle_keyrelease)
self['values'] = self._completion_list # Setup our popup menu
def autocomplete(self, delta=0):
"""autocomplete the Combobox, delta may be 0/1/-1 to cycle through possible hits"""
if delta: # need to delete selection otherwise we would fix the current position
self.delete(self.position, END)
else: # set position to end so selection starts where textentry ended
self.position = len(self.get())
# collect hits
_hits = []
for element in self._completion_list:
if element.lower().startswith(self.get().lower()): # Match case insensitively
_hits.append(element)
# if we have a new hit list, keep this in mind
if _hits != self._hits:
self._hit_index = 0
self._hits=_hits
# only allow cycling if we are in a known hit list
if _hits == self._hits and self._hits:
self._hit_index = (self._hit_index + delta) % len(self._hits)
# now finally perform the auto completion
if self._hits:
self.delete(0,END)
self.insert(0,self._hits[self._hit_index])
self.select_range(self.position,END)
def handle_keyrelease(self, event):
"""event handler for the keyrelease event on this widget"""
if event.keysym == "BackSpace":
self.delete(self.index(INSERT), END)
self.position = self.index(END)
if event.keysym == "Left":
if self.position < self.index(END): # delete the selection
self.delete(self.position, END)
else:
self.position = self.position-1 # delete one character
self.delete(self.position, END)
if event.keysym == "Right":
self.position = self.index(END) # go to end (no selection)
if len(event.keysym) == 1:
self.autocomplete()
# No need for up/down, we'll jump to the popup
# list at the position of the autocompletion
def test(test_list):
"""Run a mini application to test the AutocompleteEntry Widget."""
root = Tk(className='AutocompleteCombobox')
combo = AutocompleteCombobox(root)
combo.set_completion_list(test_list)
combo.pack()
combo.focus_set()
# I used a tiling WM with no controls, added a shortcut to quit
root.bind('<Control-Q>', lambda event=None: root.destroy())
root.bind('<Control-q>', lambda event=None: root.destroy())
root.mainloop()
if __name__ == '__main__':
test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry' )
test(test_list)
我想编辑它以包含我的功能而不是给出示例,在此先感谢。
解决方案
推荐阅读
- python - 从单个字符串到 1 列 DataFrame?
- docker - Kubernetes 入口服务不适用于不同于 root 的 URL
- python - 我想从用户那里获取输入,但只接收 numbers.in Python
- mysql - 如何使用查询构建器在 Laravel 中使用关系查询我的模型
- regex - 在值出现多次的 json 数据中替换正则表达式的语法
- sql - 表中的 SQL 更新 id 列中具有重复数据的行除外
- c# - C#当泛型类型实现某个类时如何转换类
- .net - 在 VS2010 中使用 winsock 时出错:变量“Winsock2”未声明或从未分配
- django - django allauth 自定义登录,除了电子邮件和密码外,还有其他检查
- python - Python:修复无效的 json 字符串