From 9cfb17d0abfac3b987db1edd895beed9d1440d1f Mon Sep 17 00:00:00 2001 From: Mason Fisher Date: Thu, 2 Oct 2025 19:04:21 -0400 Subject: [PATCH 1/3] Made autocomplete combobox sorting optional --- ttkwidgets/autocomplete/autocompletecombobox.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ttkwidgets/autocomplete/autocompletecombobox.py b/ttkwidgets/autocomplete/autocompletecombobox.py index 1b451139..659ad109 100644 --- a/ttkwidgets/autocomplete/autocompletecombobox.py +++ b/ttkwidgets/autocomplete/autocompletecombobox.py @@ -15,7 +15,7 @@ class AutocompleteCombobox(ttk.Combobox): """:class:`ttk.Combobox` widget that features autocompletion.""" - def __init__(self, master=None, completevalues=None, **kwargs): + def __init__(self, master=None, completevalues=None, sort=True, **kwargs): """ Create an AutocompleteCombobox. @@ -23,9 +23,11 @@ def __init__(self, master=None, completevalues=None, **kwargs): :type master: widget :param completevalues: autocompletion values :type completevalues: list + :type sort: boolean (default: True) :param kwargs: keyword arguments passed to the :class:`ttk.Combobox` initializer """ ttk.Combobox.__init__(self, master, values=completevalues, **kwargs) + self._sort = sort self._completion_list = completevalues if isinstance(completevalues, list): self.set_completion_list(completevalues) @@ -74,7 +76,12 @@ def set_completion_list(self, completion_list): :param completion_list: completion values :type completion_list: list """ - self._completion_list = sorted(completion_list, key=str.lower) # Work with a sorted list + + if self._sort: + # Work with a sorted list if sorting is enabled + self._completion_list = sorted(completion_list, key=str.lower) + else: + self._completion_list = completion_list self.configure(values=completion_list) self._hits = [] self._hit_index = 0 From 3256a067aa6093c679f815488a8abbf960a86a94 Mon Sep 17 00:00:00 2001 From: Mason Fisher Date: Thu, 2 Oct 2025 19:28:12 -0400 Subject: [PATCH 2/3] Small documentation addition --- ttkwidgets/autocomplete/autocompletecombobox.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ttkwidgets/autocomplete/autocompletecombobox.py b/ttkwidgets/autocomplete/autocompletecombobox.py index 659ad109..8f3907fe 100644 --- a/ttkwidgets/autocomplete/autocompletecombobox.py +++ b/ttkwidgets/autocomplete/autocompletecombobox.py @@ -23,6 +23,7 @@ def __init__(self, master=None, completevalues=None, sort=True, **kwargs): :type master: widget :param completevalues: autocompletion values :type completevalues: list + :param sort: sort autocompletion values, default is True for backwards compatibility with older versions :type sort: boolean (default: True) :param kwargs: keyword arguments passed to the :class:`ttk.Combobox` initializer """ From 19870ca0ee223a275de9c7e39896e1b1938c5be2 Mon Sep 17 00:00:00 2001 From: Mason Fisher Date: Fri, 3 Oct 2025 18:16:58 -0400 Subject: [PATCH 3/3] Add testing to optional sorting feature for autocompletecombobox and fix of unintended behaviour --- tests/test_autocompletewidgets.py | 8 ++++++++ ttkwidgets/autocomplete/autocompletecombobox.py | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/test_autocompletewidgets.py b/tests/test_autocompletewidgets.py index 0ac7ea70..71e764eb 100644 --- a/tests/test_autocompletewidgets.py +++ b/tests/test_autocompletewidgets.py @@ -29,6 +29,14 @@ def test_autocompletecombobox(self): box['completevalues'] = ["Test"] self.assertEqual(box['completevalues'], ["Test"]) + def test_autocompletecombobox_unsorted(self): + box = AutocompleteCombobox(self.window, completevalues=["Apple", "Pear", "Banana"], sort=False) + box.pack() + self.window.update() + + self.assertIn('completevalues', box.keys()) + self.assertEqual(box['completevalues'], ["Apple", "Pear", "Banana"]) + def test_autocompleteentry(self): entry = AutocompleteEntry(self.window, completevalues=["Apple", "Pear", "Banana"]) entry.pack() diff --git a/ttkwidgets/autocomplete/autocompletecombobox.py b/ttkwidgets/autocomplete/autocompletecombobox.py index 8f3907fe..26fa4938 100644 --- a/ttkwidgets/autocomplete/autocompletecombobox.py +++ b/ttkwidgets/autocomplete/autocompletecombobox.py @@ -78,11 +78,11 @@ def set_completion_list(self, completion_list): :type completion_list: list """ + # Clone the list to avoid unintentional modifications to the input list + self._completion_list = completion_list[:] if self._sort: # Work with a sorted list if sorting is enabled - self._completion_list = sorted(completion_list, key=str.lower) - else: - self._completion_list = completion_list + self._completion_list.sort(key=str.lower) self.configure(values=completion_list) self._hits = [] self._hit_index = 0