Показать выпадающий список при редактировании текста с помощью tkinter - PullRequest
2 голосов
/ 16 января 2020

Можно ли сделать Combobox редактируемым при открытом раскрывающемся меню? Я не нашел никакого решения. Я хочу сделать его больше похожим на поиск Google, но с помощью ComboBox.

1 Ответ

2 голосов
/ 26 января 2020

Вопрос : Показать Combobox PopdownWindow при редактировании текста

В этом примере ttk.Combobox расширяется до следующего:

  • Показать всплывающее окно при наборе
  • Открыть всплывающее окно при нажатии клавиши '<Down>'
  • Закрыть всплывающее окно при нажатии клавиши '<Up', если на первом элементе в Listbox

Ссылка :


  1. Наследование от ttk.Combox

    import tkinter as tk
    import tkinter.ttk as ttk
    
    
    class Combobox(ttk.Combobox):
    
  2. Вспомогательная функция для сопоставления внутреннего Toplevel и Listbox с tkinter объектом.

    ПРЕДУПРЕЖДЕНИЕ : при этом используются Tk/Tcl внутренние устройства, которые могут быть изменены без уведомления.
    Это может работать только с протестированной версией Tk / Tcl !

    def _tk(self, cls, parent):
        obj = cls(parent)
        obj.destroy()
        if cls is tk.Toplevel:
            obj._w = self.tk.call('ttk::combobox::PopdownWindow', self)
        else:
            obj._w = '{}.{}'.format(parent._w, 'f.l')
        return obj
    
  3. Инициализация объекта, получение внутренних ссылок и привязка к событиям нажатия клавиш

    def __init__(self, parent, **kwargs):
        super().__init__(parent, **kwargs)
        self.popdown = self._tk(tk.Toplevel, parent)
        self.listbox = self._tk(tk.Listbox, self.popdown)
    
        self.bind("<KeyPress>", self.on_keypress, '+')
        self.listbox.bind("<Up>", self.on_keypress)
    
  4. Key- Нажмите обработчик, чтобы показать или скрыть всплывающее окно и установить фокус клавиатуры.

    def on_keypress(self, event):
        if event.widget == self:
            state = self.popdown.state()
    
            if state == 'withdrawn' \
                    and event.keysym not in ['BackSpace', 'Up']:
                self.event_generate('<Button-1>')
                self.after(0, self.focus_set)
    
            if event.keysym == 'Down':
                self.after(0, self.listbox.focus_set)
    
        else:  # self.listbox
            curselection = self.listbox.curselection()
    
            if event.keysym == 'Up' and curselection[0] == 0:
                self.popdown.withdraw()
    
    

    Использование :

    class App(tk.Tk):
        def __init__(self):
            super().__init__()
    
            values = ('one', 'two', 'three', 'four', 'five', 'six', 'seven')
    
            self.cb = Combobox(self, value=values)
            self.cb.grid(row=0, column=0)
    
    
    if __name__ == "__main__":
        App().mainloop()
    
    

    Протестировано с Python: 3,5 - «TclVersion»: 8,6 «TkVersion»: 8,6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...