Combobox значение по умолчанию python

Tkinter Combobox

Краткое описание: в этом уроке вы научитесь создавать виджет Tkinter combobox, который позволяет пользователям выбирать одно значение из набора значений.

Введение в виджет Tkinter Combobox

Комбобокс — это комбинация виджета Entry и виджета Listbox. Виджет Combobox позволяет выбрать одно значение из набора значений. Кроме того, он позволяет ввести пользовательское значение.

Создание комбинированного окна

Для создания виджета combobox используется конструктор ttk.Combobox() . Следующий пример создает виджет Combobox и связывает его со строковой переменной:

current_var = tk.StringVar() combobox = ttk.Combobox(container, textvariable=current_var)
Code language: Python (python)

container — это окно или фрейм, на котором вы хотите разместить виджет combobox.

Аргумент textvariable связывает переменную current_var с текущим значением combobox.

Чтобы получить текущее выбранное значение, вы можете использовать переменную current_var:

current_value = current_var.get()
Code language: Python (python)

В качестве альтернативы можно использовать метод get() объекта combobox:

current_value = combobox.get()
Code language: Python (python)

Чтобы установить текущее значение, вы можете использовать переменную current_var или метод set() объекта combobox:

current_value.set(new_value) combobox.set(new_value)
Code language: Python (python)

Определение списка значений

У combobox есть свойство values , с помощью которого вы можете назначить ему список значений следующим образом:

combobox['values'] = ('value1', 'value2', 'value3')
Code language: Python (python)

По умолчанию вы можете ввести в combobox пользовательское значение. Если вам это не нужно, вы можете установить опцию state в ‘readonly’ :

combobox['state'] = 'readonly'
Code language: Python (python)

Чтобы снова разрешить редактирование combobox, вы используете состояние ‘normal’ следующим образом:

combobox['state'] = 'normal'
Code language: Python (python)

Привязка событий

Когда значение select изменяется, виджет combobox генерирует виртуальное событие ‘>’ . Чтобы обработать это событие, вы можете использовать метод bind() следующим образом:

combobox.bind('>', callback)
Code language: Python (python)

В этом примере функция обратного вызова будет выполняться при изменении выбранного значения combobox.

Установка текущего значения

Чтобы установить текущее значение, вы используете метод set() :

combobox.set(self, value)
Code language: Python (python)

Также вы можете использовать метод current() :

current(self, newindex=None)
Code language: Python (python)

newindex указывает индекс значения из списка, которое вы хотите выбрать в качестве текущего значения.

Если вы не укажете newindex , метод current() вернет индекс текущего значения в списке значений или -1 , если текущее значение не появится в списке.

Пример комбобокса на языке Python Tkinter

Следующая программа иллюстрирует, как создать виджет combobox:

import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo from calendar import month_name root = tk.Tk() # config the root window root.geometry('300x200') root.resizable(False, False) root.title('Combobox Widget') # label label = ttk.Label(text="Please select a month:") label.pack(fill=tk.X, padx=5, pady=5) # create a combobox selected_month = tk.StringVar() month_cb = ttk.Combobox(root, textvariable=selected_month) # get first 3 letters of every month name month_cb['values'] = [month_name[m][0:3] for m in range(1, 13)] # prevent typing a value month_cb['state'] = 'readonly' # place the widget month_cb.pack(fill=tk.X, padx=5, pady=5) # bind the selected value changes def month_changed(event): """ handle the month changed event """ showinfo( title='Result', message=f'You selected !' ) month_cb.bind('>', month_changed) root.mainloop()
Code language: Python (python)

Следующая программа показывает тот же виджет combobox с месяцем и использует метод set() для установки текущего значения в текущий месяц:

import tkinter as tk from tkinter import ttk from tkinter.messagebox import showinfo from calendar import month_name from datetime import datetime root = tk.Tk() # config the root window root.geometry('300x200') root.resizable(False, False) root.title('Combobox Widget') # label label = ttk.Label(text="Please select a month:") label.pack(fill=tk.X, padx=5, pady=5) # create a combobox selected_month = tk.StringVar() month_cb = ttk.Combobox(root, textvariable=selected_month) # get first 3 letters of every month name month_cb['values'] = [month_name[m][0:3] for m in range(1, 13)] # prevent typing a value month_cb['state'] = 'readonly' # place the widget month_cb.pack(fill=tk.X, padx=5, pady=5) # bind the selected value changes def month_changed(event): """ handle the month changed event """ showinfo( title='Result', message=f'You selected !' ) month_cb.bind('>', month_changed) # set the current month current_month = datetime.now().strftime('%b') month_cb.set(current_month) root.mainloop()
Code language: Python (python)

Резюме

  • Используйте ttk.Combobox(root, textvariable) для создания комбинированного окна.
  • Установите свойство state в readonly , чтобы пользователи не могли вводить пользовательские значения.
  • Виджет combobox испускает событие ‘>’ , когда выбранное значение изменяется.

Источник

Как задать значение по умолчанию для всех созданных combobox в Tkinter?

Почему у меня не заполняется значение по умолчания для последнего 5-го combobox? Как это исправить?
Почему когда я прохожусь по списку combo_list мне печатаются все значения, но при выполнении функции у 5-го combobox если значение не выбрать то пусто?63d78ea5cc2b4740647455.png 63d78eac03641658097137.png

Vindicar

По итогам ряда экспериментов у меня получилось следующее.

Когда ты ставишь ссылку на переменную Tk (например, экземпляр StringVar) для элемента управления, элемент запоминает внутреннее имя этой переменной (если ты его не задал явно, оно будет иметь вид PY_VAR*), а не хранит ссылку на сам экземпляр класса StringVar. Поэтому переменная умирает, когда значение питоновской переменной value перезаписывается на следующей итерации, что ломает логику работы.
Ты должен сам хранить ссылки на все StringVar на всё время жизни твоего окна. Например, так:

variables = <> def s(): unique_types = ['1', '2', '3', '4', '5'] entry = <> label = <> combo_list = [] types = ['Соответсвия нет', 'A', 'B', 'C'] for row, name in enumerate(unique_types, 0): value = StringVar() variables[name] = value lb = ttk.Label(root, text=name) lb.grid(row=row, column=0) label[name] = lb combobox = ttk.Combobox(root, textvariable=value, values=types, width=90, state="readonly") combobox.current(0) combobox.grid(row=row, column=2, padx=10, pady=5) combo_list.append(combobox) entry[name] = combobox b = ttk.Button(root, text="Print all", command=lambda: print_all_entries(unique_types, entry, label)) b.grid(row=row + 1, column=2, padx=10, pady=5)

Одна из причин, почему я обычно советую описывать окно как класс-наследник tkinter.Frame. В конструкторе создаёшь переменные, сохраняешь в поля класса, и они лежат себе. Когда экземпляр класса умрёт, они тоже уничтожатся.
А потом этот экземпляр пакуешь уже в окно верхнего уровня.

Источник

Combobox значение по умолчанию python

Виджет Combobox представляет выпадающий список, из которого пользователь может выбрать один элемент. Фактически он представляет комбинацию виджетов Entry и Listbox.

Основные параметры конструктора Combobox:

  • values : список строк для отображения в Combobox
  • background : фоновый цвет
  • cursor : курсор указателя мыши при наведении на текстовое поле
  • foreground : цвет текста
  • font : шрифт текста
  • justify : устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER — по центру, RIGHT — по правому краю
  • show : задает маску для вводимых символов
  • state : состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
  • textvariable : устанавливает привязку к элементу StringVar
  • height : высота элемента
  • width : ширина элемента

Определим простейший выпадающий список:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") languages = ["Python", "C#", "Java", "JavaScript"] combobox = ttk.Combobox(values=languages) combobox.pack(anchor=NW, padx=6, pady=6) root.mainloop()

Здесь для элемента combobox в качестве источника значений устанавливается список languages:

Combobox в Tkinter и Python

С помощью параметра textvariable мы можем установить привязку к выбранному в Combobox значению:

from cProfile import label from cgitb import text from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") languages = ["Python", "C#", "Java", "JavaScript"] # по умолчанию будет выбран первый элемент из languages languages_var = StringVar(value=languages[0]) label = ttk.Label(textvariable=languages_var) label.pack(anchor=NW, padx=6, pady=6) combobox = ttk.Combobox(textvariable=languages_var, values=languages) combobox.pack(anchor=NW, padx=6, pady=6) print(combobox.get()) root.mainloop()

Здесь выбранный в Combobox элемент привязан к переменной languages_var. По умолчанию выбран первый элемент списка languages. Для отслеживания изменения выбора определена метка Label, которая отображает выбранный элемент:

Получение выбранного элемента в Combobox в Tkinter и Python

По умолчанию мы можем ввести в текстовое поле в Combobox любое значение, даже то, которого нет в списке. Такое поведение не всегда может быть удобно. В этом случае мы можем установить для виджета состояние только для чтения, передав параметру «state» значение «readonly»:

combobox = ttk.Combobox(textvariable=languages_var, values=languages, state="readonly")

Выбранный элемент можно получить с помощью метода get() класса Combobox

либо с помощью метода get() привязанной переменной

selection = languages_var.get()

Для установки нового значения можно использовать метод set() :

languages_var.set(new_value) combobox.set(new_value)

Для установки по индексу из привязанного набора значений также можно использовать метод current(newindex) , где с помощью параметра newindex задается индекс выбранного значения. Например, выберем второй элемент:

Отслеживание выбора значения

Для обработки выбора элементов в Combobox необходимо прикрепить функцию обработки к событию > с помощью метода bind :

combobox.bind(">", функция_обработки)

Например, динамически обработаем выбор в Combobox:

from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def selected(event): # получаем выделенный элемент selection = combobox.get() print(selection) label["text"] = f"вы выбрали: " languages = ["Python", "C#", "Java", "JavaScript"] label = ttk.Label() label.pack(anchor=NW, fill=X, padx=5, pady=5) combobox = ttk.Combobox(values=languages, state="readonly") combobox.pack(anchor=NW, fill=X, padx=5, pady=5) combobox.bind(">", selected) root.mainloop()

В данном случае при изменении выбора в списке срабатывает функция selected . Функция должна принимать один параметр, который несет информацию о событии — здесь это параметр event. Хотя в данном случае он никак не используется.

В самой функции получаем выбранный элемент и выводит соответствующую информацию на метку Label.

Источник

Читайте также:  Map kotlin change value
Оцените статью