Как скрыть выпадающий список ttk.combobox без внешних стимулов

Ситуация: Когда я использую кнопку мыши, чтобы щелкнуть "стрелку вниз" на бобоксе ttk.com, стандартное поведение - показать выпадающий список. При повторном нажатии на стрелку вниз раскрывающийся список выпадающего списка станет скрытым.

С помощью клавиатуры. можно отобразить выпадающий список в выпадающем списке, нажав "стрелку вниз" один раз. Нажатие "стрелки вниз" далее прокручивает вниз выпадающий список до его конца. Повторное нажатие на "стрелку вверх" прокручивает вверх выпадающий список до тех пор, пока выделение / выделение не достигнет вершины выпадающего списка, но, в конечном итоге, не скрывает выпадающий список.

Вопрос: без использования мыши или клавиатуры, то есть с помощью компьютерного программирования, как я могу скрыть раскрывающийся список раскрывающегося списка ttk.combobox. Я знаю, что w.event_generate("<Down>") Команда может быть использована для программирования бобокса ttk.com для отображения его выпадающего списка. Но как мне добиться обратного? То есть, как я могу использовать ту же команду w.event_generate(), чтобы скрыть выпадающий список? Или какую другую команду tkinter мне следует использовать для достижения того, чего я хочу?

1 ответ

Решение

Я предпринял несколько попыток ответить на этот вопрос и, наконец, нашел способ скрыть список выпадающих списков с помощью программирования. Мой код показан ниже.

НАБЛЮДЕНИЯ:

  1. С помощью "combobox_widget_object.event_generate('<Button-1>')" может вызвать раскрывающийся список выпадающего списка. Событие '<Button-1>' по-видимому, по определению определяется, чтобы вызвать такое поведение.
  2. Выполнение 2 этой команды вплотную не приводит к отображению и скрытию выпадающего списка выпадающего списка. Это все еще только показывает раскрывающийся список, как с одной командой.
  3. "combobox_widget_object.after(delay_ms, callback=None, *args)"Этот метод может использоваться для указания комбобоксу на запуск функции после определенных временных задержек. Эта функция должна содержать
    "combobox_widget_object.event_generate('<Button-1>')" способ вызвать скрытие выпадающего списка.

КОД:

# tkinter modules
import tkinter as tk
import tkinter.ttk as ttk

"""
Aim:
Create a combobox widget and use w.event_generate(sequence, sequence,**kw) to
simulate external stimuli to cause combobox dropdown list to show and hide.

Author: Sun Bear
Date: 16/01/2017
"""

# Function to activate combobox's '<Button-1>' event
def _source_delayed_clicked():
    print ('\n def __source_delayed_clicked():')
    print('Delayed 2nd simulation of external stimuli')
    print('HIDE combobox Dropdown list. \n'
          'IT WORKED!')
    source.event_generate('<Button-1>')

root = tk.Tk()
source_var=tk.StringVar()
reference=['Peter', 'Scotty', 'Walter', 'Scott', 'Mary', 'Sarah']

# Create Main Frame in root
frame0 = ttk.Frame(root, borderwidth=10, relief=tk.RAISED)
frame0.grid(row=0, column=0, sticky='nsew') 

# Create Combobox
source = ttk.Combobox(frame0, textvariable=source_var, values=reference)
source.grid(row=0, column=0, sticky='nsew')

# Simulate external stimuli using w.event_generate(sequence,**kw)
print('\n', '1st simulation of external stimuli using: \n'
      '   source.event_generate('"<Button-1>"') \n'
      ' SHOW Combobox Dropdown List.')
source.event_generate('<Button-1>')
#source.event_generate('<Button-1>') # running another similar command
                                    # back to back didn't work
delay = 1000*6 # 6 seconds delay
source.after(delay, _source_delayed_clicked)

Обновление: в качестве альтернативы, чтобы скрыть раскрывающийся список со списком, введите командуsource.event_generate('<Escape>') может быть использован вместо source.event_generate('<Button-1>') команда, определенная в функции def _source_delayed_clicked(), Это имитирует нажатие клавиатуры "Esc" ключ.

Другие вопросы по тегам