首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在AutocompleteCombobox中将条目限制为仅可用的选项,同时能够键入?

如何在AutocompleteCombobox中将条目限制为仅可用的选项,同时能够键入?
EN

Stack Overflow用户
提问于 2022-03-07 02:42:34
回答 1查看 152关注 0票数 0

我使用来自AutocompleteComboboxttkwidgets.autocomplete作为我的选择小部件。虽然所有的功能都很好(比如能够在输入时过滤列表),但我希望能够输入它,但只能从可用的选项(即,我不能输入自定义值)中输入。我试过使用state=readonly,但它不允许我输入组合框。如有任何解决办法,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-07 11:16:43

由于您没有提供示例代码,tkinter也没有提供默认的自动完成combobx,所以我假设您使用的是来自ttkwidgets.autocompletettkwidgets.autocomplete

要只获得有效的条目(没有自定义条目),您必须重新实现AutocompleteCombobox类的自动完成方法。

逻辑很简单:检查当前用户输入是否在自动完成列表中。如果没有,请删除最后一个字符并再次显示最后一个自动完成的建议。

我使用来自这个来源的示例代码作为我的答案的基础。

下面是实现自定义MatchOnlyAutocompleteCombobox的代码片段

代码语言:javascript
复制
from tkinter import *

from ttkwidgets.autocomplete import AutocompleteCombobox

countries = [
    'Antigua and Barbuda', 'Bahamas', 'Barbados', 'Belize', 'Canada',
    'Costa Rica ', 'Cuba', 'Dominica', 'Dominican Republic', 'El Salvador ',
    'Grenada', 'Guatemala ', 'Haiti', 'Honduras ', 'Jamaica', 'Mexico',
    'Nicaragua', 'Saint Kitts and Nevis', 'Panama ', 'Saint Lucia',
    'Saint Vincent and the Grenadines', 'Trinidad and Tobago', 'United States of America'
]

ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x300')
ws.config(bg='#8DBF5A')


class MatchOnlyAutocompleteCombobox(AutocompleteCombobox):

    def autocomplete(self, delta=0):
        """
        Autocomplete the Combobox.

        :param delta: 0, 1 or -1: how to cycle through possible hits
        :type delta: int
        """
        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 not _hits:
            # No hits with current user text input
            self.position -= 1  # delete one character
            self.delete(self.position, END)
            # Display again last matched autocomplete
            self.autocomplete(delta)
            return

        # 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)


frame = Frame(ws, bg='#8DBF5A')
frame.pack(expand=True)

Label(
    frame,
    bg='#8DBF5A',
    font=('Times', 21),
    text='Countries in North America '
).pack()

entry = MatchOnlyAutocompleteCombobox(
    frame,
    width=30,
    font=('Times', 18),
    completevalues=countries
)
entry.pack()

ws.mainloop()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71375925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档