라즈베리파이 Python 프로그래밍 12: Tkinter 및 TTK 위젯
에서 이전의 튜토리얼 , 우리는 Tkinter에서 창 위젯에 대해 배우고 (아이가 GUI 응용 프로그램에서 다른 창으로하지 않은) 빈 GUI 기본 창을 설계했습니다. 자식 창은 다른 위젯의 컨테이너 역할을 합니다.
빈 창의 포인트가 없으므로 사용자와의 상호 작용을 용이하게 하기 위해 창 위젯에 포함된 다른 위젯이 있어야 합니다. 창 위젯에 포함된 위젯은 해당 창의 자식입니다.
Tk 위젯
Tk는 크로스 플랫폼 사용자 인터페이스 툴킷입니다. X11, Microsoft Windows 및 Mac OS X 시스템용 그래픽 사용자 인터페이스를 디자인하는 데 사용할 수 있습니다. 현재 Tk를 GUI 툴킷으로 사용하는 프로그래밍 언어에는 Python, Ruby, Pearl 및 Tcl이 있습니다.
GUI는 컨테이너 위젯에 배치된 여러 위젯으로 구성됩니다. 위젯은 사용자 인터페이스에서 특정 종류의 상호 작용 및 기능을 제공하는 그래픽 요소로 볼 수 있습니다. 최상위 컨테이너 위젯은 항상 창입니다.
Tk는 메뉴, 창, 표준 대화 상자 및 이미지뿐만 아니라 채우기 양식 유형 인터페이스를 위한 여러 위젯을 제공합니다. 또한 사용자 인터페이스에 대한 색상, 글꼴, 스타일 및 테마를 지원합니다.
원래 패키지에 포함된 위젯을 클래식 위젯이라고 하며 Tkinter 모듈로 패키지됩니다. Tk 8.5는 최근 ttk 패키지로 제공되는 새로운 테마 위젯 세트를 추가했습니다. 그러나 이러한 새 위젯을 Tkinter와 함께 사용하려면 ttk 패키지를 별도로 가져와야 합니다.
위젯은 각각 고유한 모양과 기능을 가진 클래스 개체로 GUI 앱에 포함됩니다. 이것은 모든 위젯이 Tkinter/ttk의 하위 클래스이며 GUI에 위젯을 포함하기 위해 해당 클래스의 객체를 인스턴스화해야 함을 의미합니다.
Tkinter에는 WYSIWYG 편집기가 없습니다. 따라서 각 위젯을 생성하려면 해당 코드를 작성하고 해당 코드 내에서 위젯을 관리해야 합니다. 모든 위젯 관리에는 일반적으로 다음 세 가지 작업이 포함됩니다.
1. 위젯의 모양 설정
2. 위젯 의 레이아웃 설정
3. 위젯에 기능 또는 동작 추가
Tkinter에서 사용 가능한 구성 옵션을 설정하여 위젯의 모양을 설정할 수 있습니다. 코드에서 이러한 구성은 해당 위젯 클래스 개체에 사용할 수 있는 속성을 설정하여 결정됩니다.
위젯의 레이아웃을 설정한다는 것은 위젯이 컨테이너 위젯(즉, 창 또는 프레임)에서 표시되어야 하는 위치와 방법을 의미합니다. Tkinter는 절대 위치 지정, 팩 레이아웃 및 그리드 레이아웃의 세 가지 유형의 레이아웃(기하학) 관리를 제공합니다.
위젯은 place(), pack() 또는 grid() 메서드를 호출하여 이러한 유형 중 하나로 구성할 수 있습니다. 위젯의 구성 옵션은 위젯에서 레이아웃 관리 메서드를 호출하기 전이나 후에 언제든지 설정할 수 있습니다. 그러나 위젯 객체에 대한 레이아웃 관리 방법(place, pack 또는 grid) 중 하나가 호출될 때까지는 컨테이너 위젯에 나타나지 않습니다.
GUI 애플리케이션은 항상 이벤트 기반이며 각 위젯에는 사용 가능한 고유한 이벤트 세트가 있습니다. 이러한 이벤트는 사용자 상호 작용에 의해 트리거됩니다. 예를 들어 사용자가 이벤트를 트리거하면 이에 대한 응답으로 코드 블록이 실행됩니다.
(위젯) 이벤트에 대한 코드 동작을 작성하는 프로세스를 이벤트 바인딩이라고 합니다. (위젯) 이벤트에 대한 응답으로 실행되는 코드 블록을 이벤트 핸들러라고 합니다. 이벤트 핸들러는 클래스 객체의 함수 또는 호출 가능한 속성/메서드가 될 수 있도록 호출 가능해야 합니다.
Tkinter에서 위젯에 기능이나 코드 동작을 추가하는 것은 해당 위젯에 대한 이벤트 바인딩과 동일합니다. 위젯에 대한 이벤트 바인딩은 호출 가능(함수 또는 클래스 메서드)을 command 속성(해당 위젯에서 사용 가능한 경우)에 할당하거나 bind() 메서드를 사용하여 수행할 수 있습니다.
ttk가 포함된 Tkinter 패키지(창, 표준 대화 상자, 메뉴 및 이미지 제외)는 다음과 같은 기본 위젯을 제공합니다.
- Frame
- Label Button
- Checkbutton
- Radiobutton
- Entry
- Combobox
- Listbox
- Scrollbar
- Sizegrip
- Text
- Progressbar
- Scale
- Spinbox
- Separator
- Labelframe
- Panedwindow
- Notebook
- Canvas
- Treeview
Frame, Label, Button, Checkbutton, Radiobutton, Entry 및 Combobox는 인터페이스의 채우기 양식 유형에 대한 위젯입니다. Listbox, Scrollbar, Sizegrip, Text, Progressbar, Scale 및 Spinbox는 특정 목적을 위한 추가 위젯입니다. Frame, Labelframe, Panedwindow 및 Notebook은 창 위젯 내에서 컨테이너 위젯 역할을 합니다.
Treeview 위젯은 계층적 순서로 정렬된 항목 목록을 표시합니다. 캔버스 위젯은 그리기, 다이어그램 작성 또는 기타 복잡한 위젯 생성에 사용할 수 있는 강력한 위젯입니다. Separator는 두 개의 서로 다른 위젯 그룹을 분리하는 데 사용할 수 있는 프레젠테이션 위젯입니다.
위에서 언급한 위젯 중 Combobox, Notebook, Separator, Progressbar, Sizegrip 및 Treeview는 ttk 패키지에만 제공되는 새로운 위젯입니다.
우리는 Raspberry Pi 레시피를 위해 GUI에서 Frame, Label, Combobox, Entry, Text, Checkbutton, Radiobutton 및 Button 위젯을 자주 사용합니다. 이러한 위젯은 아래에 설명되어 있습니다.
프레임 – 창 위젯 내에서 컨테이너 위젯 역할을 합니다. 다른 위젯을 그룹화하고 정렬하는 데 탁월한 직사각형 컨테이너입니다. 프레임은 그 안에 포함된 다른 위젯(클래스) 객체의 부모 클래스로 사용됩니다. 프레임의 대표적인 예는 윈도우 화면입니다.
프레임 개체를 인스턴스화하여 프레임을 만들 수 있습니다. 프레임 객체는 tkinter 또는 ttk 클래스의 Frame() 메서드를 사용하여 인스턴스화할 수 있습니다. 프레임 개체의 정의에는 다음 구문이 있습니다.
var = Frame(parent, [configuration options, ….)
다음은 프레임을 만드는 코드입니다.
LED_def = Frame(root) # root is the name of the parent window:
프레임 자체는 창 위젯 내에서만 만들 수 있는 컨테이너 위젯입니다. 프레임 개체의 부모는 기본 창 또는 자식 창일 수 있습니다. "상위"는 프레임 정의에 전달되어야 하는 필수 인수입니다. 위젯의 모양과 느낌을 변경하는 구성 옵션은 선택적 인수입니다.
프레임 개체에는 다음과 같은 구성 옵션이 있습니다.
Configuration Option |
Description |
bg | Description Background color behind the labels and indicators |
bd | Size of the border around the indicator |
relief | Set a 3D style to the outside of the frame |
cursor | If set to a cursor name, cursor will change to that pattern when hovering the frame |
width | Set the width of the frame |
height | Set the height of the frame |
padding |
Set the padding of the frame; if assigned single value, same value applies to all sides; if assigned to a tuple of two values, first value assigns to left and right, and second value to top and bottom; if assigned a tuple of four values, they are assigned to left, top, right and bottom respectively; |
padx | Set left and right padding |
pady | Set top and bottom padding |
style | Apply a theme style to the frame |
Tkinter의 색상(예: bg)은 색상에 대한 16진수 값(예: "#fff," #fdfdfd 등) 또는 색상 이름(예: "red," "blue," " 녹색" 등).
정수로 설정된 모든 치수(테두리 너비, 패딩 등)는 픽셀 값을 가정합니다. 다음 지표를 값에 접미사로 붙여 차원에 단위를 지정할 수 있습니다.
Character | Unit |
c | Centimeters |
i | Inches |
m | Millimeters |
p | Printer's Points |
기본적으로 프레임에는 테두리가 없습니다. "bd" 속성에 값이 할당되고 "relief" 속성에 값이 할당되면(flat 제외) 프레임에는 해당 너비와 스타일의 테두리가 있습니다. 릴리프 속성은 테두리 스타일을 결정합니다.
Tkinter에서 지원되는 릴리프 스타일은 평면, 융기, 함몰, 홈 및 융기입니다. 프레임에 "평면"이 할당된 릴리프 스타일이 있는 경우 테두리가 표시되지 않습니다.
Tkinter에서 지원되는 마우스 커서: 화살표, 원, 시계, 십자가, 도트박스, 교환, 백합, 심장, 사람, 마우스, 해적, 플러스, 셔틀, 크기 조정, 거미, 스프레이캔, 별, 대상, tcross, trek 및 watch. 기본 커서는 "화살표"입니다.
프레임에 대한 구성 옵션은 프레임 정의 내에서 키-값 쌍 인수로 설정하거나 명시적으로 정의할 수 있습니다. 다음은 프레임에 대한 구성 옵션을 설정하는 두 가지 구문을 보여줍니다.
LED_def = Frame(root, padx = 25, pady = 10)
LED_def.grid()
or
LED_def = Frame(root)
LED_def.grid()
LED_def[“padx”]= 25
LED_def[“pady”]= 10
프레임은 다른 기본 위젯의 컨테이너 위젯 역할만 하며 이벤트 바인딩은 포함하지 않습니다.
Label: 텍스트 및 이미지의 컨테이너 역할을 합니다. 레이블 안의 텍스트는 업데이트하거나 변경할 수 있습니다. 일반적으로 레이블은 인터페이스에 있는 다른 위젯의 목적을 나타내는 데 사용됩니다. 레이블은 다음과 같습니다.
레이블 개체를 인스턴스화하여 레이블을 만들 수 있습니다. 레이블 객체는 Tkinter 또는 ttk 클래스의 Label() 메서드를 사용하여 인스턴스화할 수 있습니다. 레이블 개체의 정의에는 다음 구문이 있습니다.
var = Label(parent, [configuration options, ….)
다음은 레이블을 만드는 유효한 예입니다.
label_LED_gpio = Label(LED_def, text = “Select GPIO”) # LED_def is the name of the parent window or frame
레이블 개체의 부모는 기본 창, 자식 창 또는 프레임일 수 있습니다. 레이블 개체에는 다음과 같은 구성 옵션이 있습니다.
라벨 문자열 설정
이름 | 의미 | 기본값 | 속성 |
text | 라벨에 표시할 문자열 | - | - |
textvariable | 라벨에 표시할 문자열을 가져올 변수 | - | - |
anchor | 라벨안의 문자열 또는 이미지의 위치 | center | n, ne, e, se, s, sw, w, nw, center |
justify | 라벨의 문자열이 여러 줄 일 경우 정렬 방법 | center | center, left, right |
wraplength | 자동 줄내림 설정 너비 | 0 | 상수 |
라벨 형태 설정
이름 | 의미 | 기본값 | 속성 |
width | 라벨의 너비 | 0 | 상수 |
height | 라벨의 높이 | 0 | 상수 |
relief | 라벨의 테두리 모양 | flat | flat, groove, raised, ridge, solid, sunken |
borderwidth=bd | 라벨의 테두리 두께 | 2 | 상수 |
background=bg | 라벨의 배경 색상 | SystemButtonFace | color |
foreground=fg | 라벨의 문자열 색상 | SystemButtonFace | color |
padx | 라벨의 테두리와 내용의 가로 여백 | 1 | 상수 |
pady | 라벨의 테두리와 내용의 세로 여백 | 1 | 상수 |
라벨 형식 설정
이름 | 의미 | 기본값 | 속성 |
bitmap | 라벨에 포함할 기본 이미지 | - | info, warning, error, question, questhead, hourglass, gray12, gray25, gray50, gray75 |
image | 라벨에 포함할 임의 이미지 | - | - |
compound | 라벨에 문자열과 이미지를 동시에 표시할 때 이미지의 위치 | none | bottom, center, left, none, right, top |
font | 라벨의 문자열 글꼴 설정 | TkDefaultFont | font |
cursor | 라벨의 마우스 커서 모양 | - | 커서 속성 |
라벨 상태 설정
이름 | 이미 | 기본값 | 속성 |
state | 상태 설정 | normal | normal, active, disabled |
activebackground | active 상태일 때 라벨의 배경 색상 | SystemButtonFace | color |
activeforeground | active 상태일 때 라벨의 문자열 색상 | SystemButtonText | color |
disabledforeground | disabeld 상태일 때 라벨의 문자열 색상 | SystemDisabledText | color |
라벨 하이라이트 설정
이름 | 의미 | 기본값 | 속성 |
highlightcolor | 라벨이 선택되었을 때 색상 | SystemWindowFrame | color |
highlightbackground | 라벨이 선택되지 않았을 때 색상 | SystemButtonFace | color |
highlightthickness | 라벨이 선택되었을 때 두께 (두께 설정) | 0 | 상수 |
레이블에 있는 텍스트의 글꼴은 첫 번째 요소가 글꼴 모음이고 두 번째 요소가 프린터 포인트의 글꼴 크기여야 하는 튜플로 지정할 수 있습니다. 그런 다음 가중치, 기울기, 밑줄 또는 겹침과 같은 다른 가능한 선택적 스타일 수정자가 있습니다.
Tkinter의 글꼴 패키지를 가져온 후에 글꼴 개체를 만들 수도 있습니다. 다음 구문을 사용하여 글꼴 개체를 인스턴스화하여 글꼴을 만들 수 있습니다.
Font1 = font.Font(optons, ….)
옵션은 다음과 같습니다.
- Font family – either standard, platform-specific, or a named font
- Font size – in the printer’s points
- Weight – normal or bold
- Slant – roman or italic
- Underline – set to “1” for underlined text or “0” for normal
- Overstrike – set to “1” for overstruck text and “0” for normal
글꼴 정의에서 글꼴 패밀리와 크기는 필수 옵션이고 나머지는 선택 사항입니다. 글꼴 개체를 만든 후 모든 위젯의 글꼴 속성에 할당할 수 있습니다. 다음은 글꼴 개체를 만들고 사용하는 유효한 예입니다.
from tkinter import font
labels_font = font.Font(family=’Helvetica’, size=12, weight=’bold’)
label_LED_gpio = Label(LED_def, text = “Select GPIO”, font=labels_font)
레이블에 비트맵이나 정적 이미지를 표시하는 것도 가능합니다. Tkinter에서 사용할 수 있는 비트맵에는 error, hourglass, info, guesthead, question, warning, gray75, gray50, gray25 및 gray12가 있습니다.
비트맵이 레이블에 할당된 경우 텍스트가 레이블에 표시되지 않습니다. 대신 텍스트 대신 비트맵이 표시됩니다. 레이블에 있는 텍스트의 글꼴은 튜플로 지정할 수 있습니다. 여기서 첫 번째 요소는 글꼴 모음이어야 하고 두 번째 요소는 프린터 포인트의 글꼴 크기여야 합니다. 가중치, 기울기, 밑줄 또는 겹침과 같은 다른 선택적 스타일 수정자도 있습니다.
정적 이미지를 포함하려면 Tkinter의 Python 이미지 라이브러리(PIL) 또는 최신 버전인 Pillow를 가져와야 합니다. 그러나 PIL 패키지는 Python과 함께 제공되지 않습니다. 따라서 셸(Raspberry Pi의 Bash 셸)에서 다음 명령을 실행하여 설치해야 합니다.
pip install pillow
이 명령문은 Pillow라고 하는 PIL 또는 최신 버전을 가져올 수 있습니다.
from PIL import ImageTk, Image
다음으로 ImageTk 클래스의 PhotoImage() 메서드를 사용하여 이미지 개체를 만들어야 합니다. 이미지 개체는 이미지 속성에 할당되어야 합니다. 다음은 레이블에 이미지를 포함하는 코드 예입니다.
from PIL import ImageTk, Image
myimg = ImageTk.PhotoImage(Image.open(‘myimage.png’))
label = Label(root, image=myimg)
label.grid()
이미지 객체에서 이미지를 열 때 다음 구문을 사용할 수도 있습니다.
myimg = ImageTk.PhotoImage(file = ‘myimage.png’)
Tk는 GIF 및 PPM/PNM 이미지를 지원합니다. Tk 8.6은 PNG 이미지도 지원합니다. PIL을 설치한 후 BMP, JPEG, PNG, TIFF와 같은 다른 많은 이미지 형식에 대한 지원도 포함됩니다.
PIL/Pillow를 사용할 때 이미지는 레이블에 채워지거나 부모 창의 자식 또는 부모 창 내부 프레임의 자식인 캔버스로 채워질 수 있습니다. 그러나 PIL/Pillow는 이 계층을 넘어서는 이미지를 채우지 않습니다. 예를 들어, 부모 창의 자식인 다른 프레임 내부의 프레임에 이미지를 채우는 데 실패합니다.
레이블의 텍스트는 textvariable 속성을 사용하여 변수에 바인딩할 수 있습니다. 이런 식으로 코드에서 텍스트를 업데이트하거나 변경할 수 있습니다. 다음은 레이블 텍스트를 StringVar 유형 변수에 바인딩하는 코드입니다.
from tkinter import *
from tkinter import ttk
def func():
global var
var.set(“Text is changed!”)
root = Tk()
root.title(“Dynamic Text of Label”)
root.minsize(200, 200)
var = StringVar()
label = Label(root, textvariable = var, padx = 50, pady = 50)
var.set(“Click Button to change text of this label”)
label.pack()
button = Button(root, text = “Change Text”, command = func)
button.pack()
root.mainloop()
레이블은 다른 위젯의 기능이나 목적을 나타내는 데 사용되는 텍스트 및 이미지의 컨테이너 역할을 합니다. 그러나 여전히 마우스 이벤트를 바인딩할 수 있습니다.
Combobox – ttk 패키지에서 제공됩니다. 사용자가 선택할 수 있는 텍스트 값 목록이 표시됩니다.
콤보 상자는 다음과 같습니다.
콤보 상자 개체를 인스턴스화하여 콤보 상자를 만들 수 있습니다. 콤보 상자 개체는 ttk 클래스의 Combobox() 메서드를 사용하여 인스턴스화할 수 있습니다. 콤보 상자 개체의 정의에는 다음 코드를 참고하세요.
var = ttk.Combobox(parent, [configuration options, ….) #ttk is reference to ttk class
다음은 콤보 상자를 만드는 코드를 보여줍니다.
combo_LED_config = ttk.Combobox(LED_def, values=[“Source Mode”, “Sink Mode”])
콤보 상자 개체의 부모는 기본 창, 자식 창 또는 프레임이 될 수 있습니다. 콤보 상자 개체에는 다음과 같은 구성 옵션이 있습니다.
콤보박스 메소드
set(“문자열”) | 표시값 변경 | 콤보박스의 현재 텍스트 변경 |
get() | 표시값 반환 | 콤보박스의 현재 텍스트 반환 |
current(index) | 목록 표시 | 해당 index의 목록 표시 |
콤보박스 텍스트 설정
variable | 콤보박스에 표시할 문자열을 가져올 변수 | - | - |
justify | 콤보박스의 문자열이 여러 줄 일 경우 정렬 방법 | left | center, left, right |
콤보박스 형태 설정
dth | 콤보박스의 너비 | 20 | 상수 |
height | 콤보박스의 드롭 다운 목록이 표시할 개수 | 20 | 상수 |
콤보박스 형식 설정
cursor | 콤보박스의 마우스 커서 모양 | - | 커서 속성 |
class_ | 클래스 설정 | - | - |
xscrollcommand | 콤보박스의 가로스크롤 위젯 적용 | - | Scrollbar위젯.set |
values | 콤보박스의 목록 값 | - | list, tuple 등 |
exportselection | 수치 조정 기압창의 선택 항목 여부 설정 | True | Boolean |
콤보박스 동작 설정
takefocus | Tab 키를 이용하여 위젯 이동 허용 여부 | False | Boolean |
postcommand | 콤보박스에서 드롭다운 목록을 클릭할 때 실행하는 메소드(함수) | - | 메소드, 함수 |
validate | 콤보박스의 유효성 검사 실행 조건 | none | none, focus, focusin, focusout, key, all |
validatecommand | 유효성 검사 평가 함수 | - | 함수 |
invalidcommand | validateCommand가 False를 반환 할 때 실행할 함수 | - | 함수 |
콤보 상자의 값은 Python 목록 또는 튜플로 지정할 수 있습니다. textvariable 속성을 사용하여 콤보 상자에 값을 동적으로 채울 수도 있습니다. 값은 문자열 또는 숫자일 수 있습니다.
콤보 상자는 사용자가 값 목록(텍스트 또는 숫자)에서 선택할 수 있도록 하는 데 사용됩니다. 콤보 상자를 사용하여 키보드 및 마우스 이벤트를 바인딩하는 것도 가능합니다. 그러나 가장 중요한 것은 이와 관련된 가상 이벤트입니다. 이 가상 이벤트는 "<>"이며 사용자가 콤보 상자에서 선택을 할 때 트리거됩니다. 호출 가능(함수/클래스 메서드)은 bind() 메서드를 사용하여 이 이벤트에 바인딩할 수 있습니다.
현재() 메서드를 사용하여 콤보 상자에서 기본값을 선택할 수 있으며 원하는 값의 인덱스가 인수로 전달됩니다. 콤보 상자의 값은 목록이나 튜플에서 가져오기 때문에 인덱스는 "0"부터 시작합니다.
현재() 메서드가 콤보 상자 개체에 인수 없이 사용되면 현재 선택된 값의 인덱스를 반환하고 값이 선택되지 않은 경우 "-1"을 반환합니다. get() 메서드는 현재 선택한 콤보 상자 값을 반환합니다. set(value) 메서드를 사용하면 콤보 상자의 선택된 값을 인수로 전달된 값으로 설정할 수 있습니다.
다음 예제에서는 콤보 상자를 사용하여 RPI의 GPIO 핀을 채울 수 있습니다.
combo_LED_gpio = ttk.Combobox(LED_def, value=["GPIO 00 (27)", "GPIO 01 (28),
"GPIO 07 (26)", "GPIO 08 (24),
콤보 상자 개체에 사용할 수 있는 다른 메서드에는 cget(), configure(), 식별(), instate() 및 state()가 있습니다.
콤보 상자는 Entry의 하위 클래스입니다. Entry 클래스에서 bbox(), delete(), icursor(), index(), insert(), selection() 및 xview() 메서드를 상속합니다.
Entry – 사용자로부터 한 줄의 텍스트 문자열을 허용합니다. Entry의 형태는 다음과 같습니다.
Tkinter 또는 ttk 클래스의 Entry() 메서드를 사용하여 항목 개체를 인스턴스화하여 항목을 만들 수 있습니다. 항목 개체의 정의에는 다음 구문이 있습니다.
var = Entry(parent, [configuration options, ….)
다음은 entry를 만드는 코드입니다.
entry_LED_duration = Entry(LED_def)
entry object의 부모는 기본 창, 자식 창 또는 프레임이 될 수 있습니다. entry object에는 다음과 같은 구성 옵션이 있습니다.
Entry 문자열 설정
이름 | 의미 | 기본값 | 속성 |
show | 기입창에 표시되는 문자 | - | 문자 |
textvariable | 기입창에 표시할 문자열을 가져올 변수 | - | - |
justify | 기입창의 문자열이 여러 줄 일 경우 정렬 방법 | center | center, left, right |
Entry 형태 설정
이름 | 의미 | 기본값 | 속성 |
width | 기입창의 너비 | 0 | 상수 |
relief | 기입창의 테두리 모양 | flat | flat, groove, raised, ridge, solid, sunken |
borderwidth=bd | 기입창의 테두리 두께 | 2 | 상수 |
background=bg | 기입창의 배경 색상 | SystemButtonFace | color |
foreground=fg | 기입창의 문자열 색상 | SystemButtonFace | color |
insertwidth | 기입창의 키보드 커서 너비 | 2 | 상수 |
insertborderwidth | 기입창의 키보드 커서 테두리 두께 | 0 | 상수 |
insertbackground | 기입창의 키보드 커서 색상 | SystemWindowText | color |
selectborderwidth | 기입창의 문자열 블록처리 테두리 두께 | 0 | 상수 |
selectbackground | 기입창의 문자열 블록처리 배경 색상 | SystemHighlight | color |
selectforeground | 기입창의 문자열 블록처리 문자열 색상 | SystemHighlight | color |
Entry 형식 설정
이름 | 의미 | 기본값 | 속성 |
font | 기입창의 문자열 글꼴 설정 | TkDefaultFont | font |
cursor | 기입창의 마우스 커서 모양 | - | 커서 속성 |
xscrollcommand | 기입창의 가로스크롤 위젯 적용 | - | Scrollbar위젯.set |
Entry 상태 설정
이름 | 의미 | 기본값 | 속성 |
state | 상태 설정 | normal | normal, readonly, disabled |
readonlybackground | readonly 상태일 때 기입창의 배경 색상 | SystemButtonFace | color |
disabledbackground | disabeld 상태일 때 기입창의 배경 색상 | SystemButtonFace | color |
disabledforeground | disabeld 상태일 때 기입창의 문자열 색상 | SystemDisabledText | color |
Entry 하이라이트 설정
이름 | 의미 | 기본값 | 속성 |
highlightcolor | 기입창이 선택되었을 때 색상 | SystemWindowFrame | color |
highlightbackground | 기입창이 선택되지 않았을 때 색상 | SystemButtonFace | color |
highlightthickness | 기입창이 선택되었을 때 두께 (두께 설정) | 0 | 상수 |
Entry 동작 설정
이름 | 의미 | 기본값 | 속성 |
takefocus | Tab 키를 이용하여 위젯 이동 허용 여부 | True | Boolean |
insertontime | 기입창의 키보드 커서 깜빡임이 보이는 시간 | 600 | 상수(ms) |
insertofftime | 기입창의 키보드 커서 깜빡임이 보이지 않는 시간 | 300 | 상수(ms) |
항목은 사용자로부터 숫자 또는 한 줄 텍스트 입력을 받는 데 사용됩니다. 사용자가 입력한 숫자 또는 텍스트 값은 Entry의 get() 메서드를 사용하여 검색할 수 있습니다. 콜러블은 명령 속성에 할당하여 상태(위젯의 상태가 아닌 항목의 내용 상태)의 변경 사항에 대해 항목에 바인딩할 수 있습니다.
일반적으로 콜러블은 데이터 유효성 검사를 위해 명령 속성을 통해 항목에 바인딩됩니다. 키보드 또는 마우스 이벤트는 bind() 메서드를 사용하여 항목에 바인딩할 수 있습니다. 이러한 경우 호출 가능(이벤트 핸들러)은 이벤트를 인수 중 하나로 갖습니다.
아래 메소드는 Entry 위젯에 사용할 수 있습니다.
이름 | 의미 |
insert(index, “문자열”) | index 위치에 문자열 추가 |
delete(start_index, end_index) | start_index부터 end_index까지의 문자열 삭제 |
get() | 기입창의 텍스트를 문자열로 반환 |
index(index) | index에 대응하는 위치 획득 |
icursor(index) | index 앞에 키보드 커서 설정 |
select_adjust(index) | index 위치까지의 문자열을 블록처리 |
select_range(start_index, end_index) | start_index부터 end_index까지 블록처리 |
select_to(index) | 키보드 커서부터 index까지 블록처리 |
select_from(index) | 키보드 커서의 색인 위치를 index 위치에 문자로 설정하고 선택 |
select_present() | 블록처리 되어있는 경우 True, 아닐 경우 False |
select_clear() | 블록처리 해제 |
xview() | 가로스크롤 연결 |
xview_scroll(num, str) | 가로스크롤의 속성 설정 |
Text – 사용자의 여러 줄 텍스트를 문자열 개체로 받아들입니다. 사용 형태는 아래와 같습니다.
텍스트 개체를 인스턴스화하여 텍스트 위젯을 만들 수 있습니다. 텍스트 객체는 Tkinter 또는 ttk 클래스의 Text() 메서드를 사용하여 인스턴스화할 수 있습니다. 텍스트 개체의 정의에는 다음 구문이 있습니다.
var = Text(parent, [configuration options, ….)
다음은 텍스트 위젯을 만드는 코드입니다.
text_cLCD_message = Text(cLCD_init) #cLCD_init is the name of parent frame or window
텍스트 개체의 부모는 기본 창, 자식 창 또는 프레임이 될 수 있습니다. 텍스트 개체에는 다음과 같은 구성 옵션이 있습니다.
이름 | 텍스트 | 의미 |
- | y.x | y 번째 줄 x 번째 문자 |
- | 1.0 | 첫 번째 줄 첫 번째 문자 |
- | y.0 | y 번째 줄 첫 번째 문자 |
- | y.end | y 번째 줄 마지막 문자 |
tkinter.INSERT | insert | 삽입 커서의 위치 |
tkinert.CURRENT | current | 마우스 포인터에 가장 가까운 문자의 위치 |
tkinter.END | end | 텍스트의 마지막 문자 위치 |
tkinert.SEL_FIRST | sel.firs t | 블록처리 되었을 때의 앞 부분 |
tkinert.SEL_LAST | sel.last | 블록처리 되었을 때의 뒷 부분 |
- | [마크] linestart | 마크에서 앞의 행 |
- | [마크] lineend | 마크에서 뒤의 행 |
- | [마크] wordstart | 마크에서 단어의 앞 |
Text 텍스트 설정
이름 | 의미 | 기본값 | 속성 |
wrap | 자동 줄 내림 설정 방법 | char | none, char, word |
tabs | 텍스트의 Tab 간격 | 56 | 상수 |
tabstyle | 텍스트의 Tab 간격 형식 | tabular | tabular, wordprocessor |
startline | 텍스트의 데이터 저장소에 저장될 시작 줄 | 시작 줄 | 상수 |
endline | 텍스트의 데이터 저장소에 저장될 마지막 줄 | 마지막 줄 | 상수 |
spacing1 | 텍스트의 상단 수직 간격 | 0 | 상수 |
spacing2 | 텍스트의 줄과 줄 사이 간격 | 0 | 상수 |
spacing3 | 텍스트의 하단 수직 간격 | 0 | 상수 |
Text 형태 설정
이름 | 의미 | 기본값 | 속성 |
width | 텍스트의 너비 | 80 | 상수 |
height | 텍스트의 높이 | 24 | 상수 |
relief | 텍스트의 테두리 모양 | flat | flat, groove, raised, ridge, solid, sunken |
borderwidth=bd | 텍스트의 테두리 두께 | 1 | 상수 |
background=bg | 텍스트의 배경 색상 | SystemButtonFace | color |
foreground=fg | 텍스트의 문자열 색상 | SystemButtonFace | color |
insertwidth | 텍스트의 키보드 커서 너비 | 2 | 상수 |
insertborderwidth | 텍스트의 키보드 커서 테두리 두께 | 0 | 상수 |
insertbackground | 텍스트의 키보드 커서 색상 | SystemWindowText | color |
selectborderwidth | 텍스트의 문자열 블록처리 테두리 두께 | 0 | 상수 |
selectbackground | 텍스트의 문자열 블록처리 배경 색상 | SystemHighlightText | color |
selectforeground | 텍스트의 문자열 블록처리 문자열 색상 | SystemHighlightText | color |
inactiveselectbackground | 텍스트의 문자열 블록처리 중 다른 위젯 선택시 블록처리 배경 색상 | - | color |
padx | 텍스트의 테두리와 내용의 가로 여백 | 1 | 상수 |
pady | 텍스트의 테두리와 내용의 세로 여백 | 1 | 상수 |
Text 형식 설정
이름 | 의미 | 기본값 | 속성 |
font | 텍스트의 문자열 글꼴 설정 | TkDefaultFont | font |
cursor | 텍스트의 마우스 커서 모양 | - | 커서 속성 |
xscrollcommand | 텍스트의 가로스크롤 객체 적용 | - | Scrollbar위젯.set |
yscrollcommand | 텍스트의 세로스크롤 객체 적용 | - | Scrollbar위젯.set |
exportselection | 텍스트의 선택 항목 여부 설정 | True | Boolean |
setgrid | 텍스트의 격자 크기 조정 설정 | False | Boolean |
Text 상태 설정
이름 | 의미 | 기본값 | 속성 |
state | 상태 설정 | normal | normal, disabled |
Text 하이라이트 설정
이름 | 의미 | 기본값 | 속성 |
highlightcolor | 텍스트가 선택되었을 때 색상 | SystemWindowFrame | color |
highlightbackground | 텍스트가 선택되지 않았을 때 색상 | SystemButtonFace | color |
highlightthickness | 텍스트가 선택되었을 때 두께 (두께 설정) | 0 | 상수 |
Text 동작 설정
이름 | 의미 | 기본값 | 속성 |
takefocus | Tab 키를 이용하여 위젯 이동 허용 여부 | False | Boolean |
blockcursor | 텍스트의 키보드 커서를 블록으로 사용 | False | Boolean |
undo | 텍스트의 실행 취소 사용 여부 | False | Boolean |
maxundo | 텍스트의 실행 취소 최대 횟수 | - | 상수 |
autoseparators | 텍스트의 실행 취소 자동 저장 여부 | True | Boolean |
텍스트 위젯에는 명령 및 텍스트 변수 속성이 없습니다. 사용자가 Text 위젯에 입력한 여러 줄 텍스트는 get() 메서드를 사용하여 검색할 수 있습니다. 키보드 또는 마우스 이벤트는 bind() 메서드를 사용하여 Text 위젯에 바인딩할 수 있습니다. 텍스트 위젯은 텍스트 콘텐츠의 형식 지정에 유용한 탭, 표시 및 색인과 같은 일부 도우미 구조를 지원합니다. 텍스트 위젯에는 다음 메서드를 사용할 수 있습니다.
Text 문자열 메소드
이름 | 기능 | 설명 |
insert(index, “문자열”) | 문자열 삽입 | 해당 index 위치에 문자열을 삽입 |
delete(start_index, end_index) | 문자열 삭제 | start_index부터 end_index까지의 문자열 삭제 |
get(start_index, end_index) | 문자열 반환 | start_index부터 end_index까지의 문자열 반환 |
index(index) | 인덱스 반환 | index가 음수 일 경우, 1.0으로 반환 |
see(index) | 문자열 표시 반환 | index 위치에 텍스트가 표시되면 True 반환 |
Text 마크 매소드
이름 | 기능 | 설명 |
mark_set(mark, index) | 마크 위치 설정 | 해당 마크의 위치 재설정 |
mark_unset(mark) | 마크 위치 제거 | 해당 마크의 표시 제거 |
mark_gravity(mark,gravity) | 키보드 커서 삽입 위치 변경 | 해당 마크 사용 시, 좌측 삽입 또는 우측 삽입으로 변경 |
index(mark) | 마크 위치 반환 | 해당 마크 위치 반환 |
mark_names() | 모든 마크 반환 | 텍스트에서 사용된 모든 마크를 반환 |
Text Tag 메소드
이름 | 의미 | 설명 |
tag_add(tagname, start_index, end_index) | 태그 생성 | start_index부터 end_index까지의 tagname을 생성 |
tag_remove(tagname, start_index, end_index) | 태그 제거 | start_index부터 end_index까지의 tagname의 설정 제거 |
tag_delete(tagname) | 태그 삭제 | tagname의 설정 및 선언 삭제 |
tag_config(tagname, 파라미터1, 파라미터2, …) | 태그 부착 | tagname 범위 만큼 속성 설정 |
텍스트 위젯에는 탭, 표시 및 색인에 대한 추가 메서드가 있습니다.
텍스트 위젯의 인덱스는 line_number.character_position 형식입니다. 따라서 "1.0"은 "1" 줄의 "0" 위치에 있는 문자를 나타냅니다.
linestart, lineend, insert, end, wordstart, wordend 및 chars와 같은 키워드는 인덱스 또는 인덱스의 일부로 사용할 수 있습니다.
예를 들어:
- "2.2 linestart"는 2행의 첫 번째 문자를 나타냅니다.
- "2.2 lineend"는 2행 끝에 있는 개행을 나타냅니다.
- "2.0 + 3 chars"는 2행 이후 3개의 문자를 나타냅니다... 등등
Checkbutton – 사용자가 옵션에 대한 값을 선택할 수 있도록 합니다. 한 번에 둘 이상일 수 있습니다. 이 버튼은 사용자가 토글할 수 있는 이진 값을 보유합니다. 사용자가 값을 토글하면 명령 콜백이 호출될 수 있습니다. 체크 버튼의 사용 형태는 아래와 같습니다.
Checkbutton 개체를 인스턴스화하여 Checkbutton을 만들 수 있습니다. Checkbutton 객체는 Tkinter의 Checkbutton() 메서드 또는 ttk 클래스를 사용하여 인스턴스화할 수 있습니다. Checkbutton 개체의 정의에는 다음 구문이 있습니다.
var = Checkbutton(parent, [configuration options, ….)
다음은 체크 버튼을 생성하는 유효한 예입니다.
animation_flag = StringVar()
check_cLCD_animate = Checkbutton(cLCD_int, text = “Animate Text”, command =
cLCD_Text_Animation, variable = animation_flag) #cLCD_init is the name of parent frame or window
Checkbutton의 부모는 기본 창, 자식 창 또는 프레임이 될 수 있습니다. Checkbutton에는 다음과 같은 구성 파라메터가 있습니다.
여기
체크 버튼은 한 번에 설정하거나 지울 수 있으며 변수와 쌍을 이루어 토글 상태를 계속 확인할 수 있습니다. "onvalue" 및 "offvalue" 속성을 설정하면 상태가 변경될 때 부울이 아닌 값을 검색할 수 있습니다.
콜러블을 명령 속성에 할당하여 사용자 상호 작용 중에 코드 동작을 실행할 수 있습니다. invoke() 메소드를 사용하여 콜러블을 실행할 수도 있습니다.
키보드 또는 마우스 이벤트를 Checkbutton에 바인딩하기 위한 논리가 없습니다. 그러나 마우스 이벤트는 일종의 그래픽 효과를 위해 bind() 메서드를 사용하여 Checkbutton에 바인딩할 수 있습니다.
확인 버튼에는 다음과 같은 메소드를 사용할 수 있습니다.
이름 | 기능 |
select() | 체크 상태 |
deselect() | 해제 상태 |
toggle() | 토글 |
invoke() | 체크 버튼 실행 |
flash() | 깜빡임 |
라디오 버튼 – 사용자가 옵션에 대한 여러 값에서 하나의 값만 선택할 수 있습니다. 탭 키를 사용하여 사용 가능한 값을 탐색할 수 있습니다. 라디오 버튼 그룹은 단일 변수와 연결되어야 하며 각각은 고유한 값을 보유해야 합니다.
Radiobutton 사용 형태는 아래와 같습니다.
Radiobutton 개체를 인스턴스화하여 Radiobutton을 만들 수 있습니다. Radiobutton 객체는 Tkinter 또는 ttk 클래스의 Radiobutton() 메서드를 사용하여 인스턴스화할 수 있습니다. Radiobutton 객체의 정의에는 다음 구문이 있습니다.
var = Radiobutton(parent, [configuration options, ….)
이것은 라디오 버튼을 생성하기 위한 유효한 예입니다:
watch_mode = StringVar()
radio_datetime_mode = Radiobutton(watch_int, variable = watch_mode, text = “Display only Date and Time”) #watch_init is the name of parent frame or window
radio_datetimetemp_mode = Radiobutton(watch_int, variable = watch_mode, text = “Display Date Time and Temperature”)
radio_datetime_temp_hum_mode = Radiobutton(watch_int, variable = watch_mode, text = “Display Date Time, Temperature and Humidity”)
라디오 버튼의 부모는 기본 창, 자식 창 또는 프레임이 될 수 있습니다. 라디오 버튼에는 다음과 같은 구성 옵션이 있습니다.
또한 제어 변수는 라디오 버튼의 상태를 추적할 수 있으며 선택한 라디오 버튼에 할당된 숫자 또는 문자열 값을 보유할 수 있습니다. 콜러블을 command 속성에 할당하여 Radiobutton 객체에 코드 동작을 추가할 수 있습니다.
invoke() 메소드를 사용하여 콜러블을 실행하는 것도 가능합니다. 그러나 일부 마우스 이벤트를 사용하여 라디오 버튼의 특정 그래픽 효과를 애니메이션할 수는 있지만 bind() 메서드를 사용하여 라디오 버튼에 키보드 또는 마우스 이벤트를 바인딩하는 것은 의미가 없습니다.
라디오 버튼에는 다음과 같은 메서드가 있습니다.
이름 | 기능 |
select() | 체크 상태 |
deselect() | 해제 상태 |
invoke() | 체크 버튼 실행 |
flash() | 깜빡임 |
Button – 사용자가 특정 작업을 실행할 수 있습니다. 목적을 나타내기 위해 버튼에 텍스트나 이미지를 표시할 수 있습니다. 버튼은 사용자가 눌렀을 때 실행되어야 하는 콜러블과 연결되어 있습니다. 버튼 사용 형태는 아래과 같습니다.
Button 개체를 인스턴스화하여 Button을 만들 수 있습니다. Button 객체는 Tkinter의 Button() 메서드나 ttk 클래스를 사용하여 인스턴스화할 수 있습니다. Button 개체의 정의에는 다음 구문이 있습니다.
var = Button(parent, [configuration options, ….)
다음은 Button 생성에 대한 유효한 예입니다.
button_LED_signal = Button(LED_def, text = “Generate Signal”, command =
thread_generate_LED_signal) #LED_def is name of parent window or frame
Button의 부모는 기본 창, 자식 창 또는 프레임이 될 수 있습니다. 버튼에는 다음과 같은 구성 옵션이 있습니다.
명령 속성에 콜러블을 할당하여 버튼에 코드 동작을 추가할 수 있습니다. Callable은 Button 객체의 invoke() 메서드를 사용하여 실행할 수도 있습니다.
기본적으로 콜러블은 사용자가 버튼을 누를 때 실행되어야 합니다. 다른 키보드 또는 마우스 이벤트를 Button 개체에 바인딩할 필요가 없습니다. 그러나 키보드 단축키를 통해 작업을 실행해야 하는 경우 bind() 메서드를 사용하여 일부 키보드 이벤트를 버튼에 바인딩하는 것이 유용할 수 있습니다.
이러한 위젯을 사용하여 RPi 레시피에 대한 대부분의 인터페이스를 설계할 수 있습니다. 레시피의 GUI에 다른 위젯을 포함하면 그때 소개하겠습니다.
다음 튜토리얼에서 Tkinter/TTK 메뉴, 레이아웃 관리, 이벤트 바인딩 및 멀티 스레딩을 논의 할 것이다. 이것은 첫 번째 Raspberry Pi 레시피인 LED 드라이버를 테스트하기에 충분합니다.
스스로 해 볼 것.
마이크로컨트롤러에 대한 배경 지식이 있는 경우 임베디드 작업을 제어하는 데 다른 Tkinter/ttk 위젯의 사용을 추측해 보십시오. 예를 들어, 스케일 위젯을 사용하여 PWM 신호의 듀티 사이클을 제어하거나 DC 모터의 속도를 제어할 수 있습니다.
버튼을 누를 때 문자 LCD에 전달될 수 있는 문자 메시지를 포함하기 위해 Entry 또는 Text 위젯을 사용할 수도 있습니다. 마이크로컨트롤러 경험에서 임베디드 애플리케이션에서 다른 Tkinter/ttk 위젯을 사용할 수 있는 상황에 대해 생각해 보십시오. 또한 센서에서 데이터를 읽을 수 있는 상황을 상기하십시오.
이러한 상황과 Tkinter/ttk 위젯을 사용하여 다른 하드웨어 구성 요소를 제어할 때 직면할 수 있는 가능한 어려움을 평가해 보십시오.
한 가지 예는 텍스트 위젯에 "텍스트 변수" 또는 명령 속성이 없다는 것입니다. 이 경우 텍스트 위젯에서 문자 LCD로 동적 문자 메시지를 전달할 수 있습니까? 브레인스토밍 시작!
참고
Python tkinter 강좌 : 제 26강 - Combobox
How To Create ComboBox In TKinter Python
'개발자 > 라즈베리파이4' 카테고리의 다른 글
라즈베리파이 Python 프로그래밍 15: 푸시 버튼 및 디지털 입력 인터페이스 (0) | 2021.11.19 |
---|---|
라즈베리파이 Python 프로그래밍 14: GUI 제어 LED 드라이버 (0) | 2021.11.18 |
라즈베리파이 4 기반 IoT(사물인터넷) 설계 5강 스마트 IoT 설계 시스템 (0) | 2021.11.17 |
라즈베리파이 Python 프로그래밍 13: TTK 메뉴, 레이아웃 관리, 이벤트 및 멀티스레딩 (0) | 2021.11.17 |
라즈베리파이 Python 프로그래밍 11: Tkinter를 사용한 Python GUI (0) | 2021.11.15 |
라즈베리파이 4 Adafruit DHT11 DHT22 온도 습도 센서 문제 (0) | 2021.11.11 |
라즈베리파이 4에서 VNC 접속하여 사용하기 Raspberry Pi4 VNC Connect (2) | 2021.11.10 |
라즈베리파이 Python Programming 10: 객체 지향 Python (0) | 2021.11.05 |
더욱 좋은 정보를 제공하겠습니다.~ ^^