Можно ли сделать Combobox редактируемым при открытом раскрывающемся меню? Я не нашел никакого решения. Я хочу сделать его больше похожим на поиск Google, но с помощью ComboBox.
Вопрос : Показать Combobox PopdownWindow при редактировании текста
Combobox
В этом примере ttk.Combobox расширяется до следующего:
ttk.Combobox
'<Down>'
'<Up'
Listbox
Ссылка :
События и привязки
Для каждого виджета вы можете привязать Python функции и методы к событиям.
ttk::combobox - текстовое поле со всплывающим списком выбора
ttk::combobox
* * * * * ttk::combobox использует внутренние виджеты entry и listbox.
entry
listbox
Наследование от ttk.Combox
ttk.Combox
import tkinter as tk import tkinter.ttk as ttk class Combobox(ttk.Combobox):
Вспомогательная функция для сопоставления внутреннего Toplevel и Listbox с tkinter объектом.
Toplevel
tkinter
ПРЕДУПРЕЖДЕНИЕ : при этом используются Tk/Tcl внутренние устройства, которые могут быть изменены без уведомления. Это может работать только с протестированной версией 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
Инициализация объекта, получение внутренних ссылок и привязка к событиям нажатия клавиш
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)
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