Tkinter Combobox

2024. 3. 2. 17:55GUI/tkinter

요약 : 이 튜토리얼에서는 사용자가 값 세트에서 하나의 값을 선택할 수 있도록 하는 Tkinter 콤보박스 위젯을 만드는 방법을 배웁니다.

Tkinter Combobox 위젯 소개

콤보박스는 Entry 위젯과 Listbox 위젯의 조합입니다. 콤보박스 위젯을 사용하면 값 집합에서 하나의 값을 선택할 수 있습니다. 또한 사용자 정의 값을 입력할 수도 있습니다.

콤보박스 만들기

콤보박스 위젯을 생성하려면 ttk.Combobox() 생성자를 사용합니다. 다음 예에서는 콤보박스 위젯을 생성하고 이를 문자열 변수에 연결합니다.

current_var = tk.StringVar()
combobox = ttk.Combobox(container, textvariable=current_var)

container는 콤보 박스 위젯을 배치할 창 이나 프레임입니다 .

textvariable 인수는 current_var 변수를 콤보 상자의 현재 값에 연결합니다.

현재 선택된 값을 얻으려면, current_var 변수를 사용할 수 있습니다.

current_value = current_var.get()

또는 콤보박스 개체의 get() 메서드를 사용할 수 있습니다.

current_value = combobox.get()

현재 값을 설정하려면 current_var 변수나 콤보박스 개체의 set() 메서드를 사용합니다.

current_value.set(new_value)
combobox.set(new_value)

값 목록 정의

콤보박스에는 다음과 같이 값 목록을 할당할 수 있는 values 속성이 있습니다.

combobox['values'] = ('value1', 'value2', 'value3')

기본적으로 콤보 상자에 사용자 정의 값을 입력할 수 있습니다. 이를 원하지 않으면 state 옵션을 다음과 같이 'readonly'로 설정할 수 있습니다.

combobox['state'] = 'readonly'

콤보박스 편집을 다시 활성화하려면 다음과 같은 'normal' 상태를 사용합니다.

combobox['state'] = 'normal'

이벤트 바인딩

선택 값이 변경되면, 콤보박스 위젯은 '<>' 가상 이벤트를 생성합니다. 이벤트를 처리하려면 다음과 같이 bind() 메서드를 사용할 수 있습니다.

combobox.bind('<>', callback)

또한 다음처럼 current() 메서드를 사용할 수 있습니다.

current(self, newindex=None)

newindex는 현재 값으로 선택하려는 목록의 값 인덱스를 지정합니다.

newindex를 지정하지 않으면, current() 메서드는 값 목록에 있는 현재 값의 인덱스를 반환하거나 현재 값이 목록에 나타나지 않는 경우 -1를 반환합니다.

Python Tkinter 콤보박스 예제

다음 프로그램은 콤보박스 위젯을 생성하는 방법을 보여줍니다.

In [8]:
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 {selected_month.get()}!'
    )

month_cb.bind('<<ComboboxSelected>>', month_changed)

root.mainloop()

 

 

다음 프로그램은 같은 달 콤보 상자 위젯을 표시하고 set() 메서드를 사용하여 현재 값을 현재 달로 설정합니다.

In [9]:
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 {selected_month.get()}!'
    )


month_cb.bind('<<ComboboxSelected>>', month_changed)

# set the current month
current_month = datetime.now().strftime('%b')
month_cb.set(current_month)

root.mainloop()

 

 

요약

  • ttk.Combobox(root, textvariable)는 콤보박스를 생성하는 데 사용됩니다.
  • 사용자가 사용자 정의 값을 입력하지 못하도록 하려면 state 속성을 readonly로 설정합니다.
  • 콤보박스 위젯은 선택한 값이 변경되면 '<>' 이벤트를 발생시킵니다.

'GUI > tkinter' 카테고리의 다른 글

Tkinter Slider  (0) 2024.03.04
Tkinter Listbox  (0) 2024.03.03
Tkinter Radio Button  (0) 2024.03.01
Tkinter Checkbox  (0) 2024.02.29
Tkinter Separator  (0) 2024.02.28