Вы были очень близки!
combobox_values = "\n".join(my_dict.keys())
должен быть
combobox_values = my_dict.keys()
Используя join, вы берете все ключи из словаря, а затем поместить их в одну строку! Когда Tkinter пытается определить вашу строку, он решает, что пробелы так же хороши, как новые строки для разбивки элементов.
Было немного сложно определить маршрут, используемый под капотом. The official docs don't mention
Проверка исходного кода Combobox
наследуется от виджета Entry
, но оба делают необработанные вызовы в базовом tcl. New Mexico (как правило, уважаемый) утверждает, что значения должны быть в списке, но явно работает строка. Начиная с strings and lists are very similar in python, сбой-медленный подход ttk кажется подходящим ... но он не отвечает на вопрос ...
На самом деле, вот забавная игра: попробуйте разбить конструктор. Пропустить случайное число? Следующие работы всех
ttk.Combobox(root, values=12345)
class Foo:pass
ttk.Combobox(root, values=Foo())
ttk.Combobox(root, values=Foo)
После дальнейших исследований, окончательное Python вызов происходит по линии 2058 из Tkinter.py
(или около того, в зависимости от реализации). Если вам действительно интересно, вы можете проследить от tcl docs до their detailed widgets section, в частности, главу «Сохранение дополнительных данных элемента», чтобы узнать, как и почему это происходит, как и они.
В последних двух методах отображения , что ввод завершается как его собственное представление строки (в соответствии с интерпретацией Нью-Мексико), но лежащий в основе метод остается уклончивым