파이썬 tkinter 예제 - paisseon tkinter yeje

1. Tkinter 소개

Tkinter는 Tcl/Tk에 대한 파이썬 Wrapper로서 Tcl/Tk를 파이썬에 사용할 수 있도록 한 Lightweight GUI 모듈이다. Tcl은 Tool Command Language의 약자로서 일종의 프로그래밍 언어이며, Tk는 크로스 플랫폼에 사용되는 일종의 GUI 툴킷이다. Tkinter는 타 GUI 프레임워크나 툴킷에 비해 지원되는 위젯들이 부족하고 UI도 그렇게 예쁘지 않다는 단점이 있지만, Python 설치시 기본적으로 내장되어 있는 파이썬 표준 라이브러리이기 때문에 쉽고 간단한 GUI 프로그램을 만들 때 활용될 수 있다.
여기서는 Python 3.4에 있는 Tkinter를 사용하며, Tkinter의 기본적인 개념 및 기초 사용법 만을 소개한다.

2. Tkinter의 기본 문장

Tkinter는 파이썬에 기본 내장되어 있기 때문에 PyQt처럼 별도로 설치할 필요가 없다. Tkinter를 사용하기 위해서는 먼저 tkinter 모듈을 아래와 같이 import 해야 한다 (주: Python 2에서는 Tkinter를 import 하고, Python 3 에서는 tkinter를 import 한다). tkinter 모듈을 import한 다음에는 Tk 클래스 객체(root)를 생성하고, 이 객체의 mainloop() 메서드를 호출한다. 아래 코드와 같이 이런 기본 문장들을 수행하면, 빈 다이얼로그가 화면에 표시된다.

from tkinter import * root = Tk() root.mainloop()

mainloop()는 이벤트 메시지 루프로서 키보드나 마우스 혹은 화면 Redraw와 같은 다양한 이벤트로부터 오는 메시지를 받고 전달하는 역활을 한다.

3. 간단한 다이얼로그

그럼 Tkinter를 이용하여 간단한 다이얼로그를 만들어 보는데, 이 다이얼로그에는 하나의 레이블, 하나의 텍스트박스, 하나의 버튼이 있다고 가정하자. 이러한 위젯들은 보통 root 객체 생성(root = Tk())과 root.mainloop() 사이에 생성하게 된다. 아래 예제는 "이름" 이라는 레이블(Label 위젯)과 중간에 텍스트박스(Entry 위젯) 하나, 그리고 맨 밑에 OK 버튼(Button 위젯)을 가지도록 한 코드이다 (여기서 pack에 대해서 아래 설명).

from tkinter import * root = Tk() lbl = Label(root, text="이름") lbl.pack() txt = Entry(root) txt.pack() btn = Button(root, text="OK") btn.pack() root.mainloop()

4. Geometry Manager

Tkinter에서 위젯들을 화면에 배치하는 방식에는 다음과 같은 3가지 방식이 있다.

  • Place (혹은 absolute) 위젯을 위치를 절대 좌표로 정하는 것으로, 윈도우 크기 변경에 따라 위젯들이 변경되지 않으므로 많이 사용되지 않는다. 이 방식은 위젯.place() 메서드를 사용한다.
  • Pack 위젯들을 부모 위젯에 모두 패킹하여 불필요한 공간을 없앤다. 위젯.pack() 메서드를 사용한다.
  • Grid 위젯들을 테이블 레이아웃에 배치하는 것으로 지정된 row, column에 위젯을 놓는다. 위젯.grid() 메서드를 사용한다.

위의 #3 예제에서는 pack 방식을 사용하여 위젯들이 상하(디폴트)로 패킹되었음을 보았다. 아래 예제는 grid 방식으로 위젯을 배치하는 예이다. grid() 메소드에서 row와 column을 정해 주면, 해당 위치에 위젯이 놓이게 된다.

from tkinter import * root = Tk() lbl = Label(root, text="이름") lbl.grid(row=0, column=0) txt = Entry(root) txt.grid(row=0, column=1) btn = Button(root, text="OK", width=15) btn.grid(row=1, column=1) root.mainloop()

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.


1. Tkinter 위젯

앞 아티클에서 언급했듯이, Tkinter는 제한된(Limited) 핵심 위젯들만을 제공하고 있다. 아래는 Tkinter가 제공하는 주요 위젯들이다.

위젯설명
Button 단순한 버튼
Label 텍스트 혹은 이미지 표시
CheckButton 체크박스
Entry 단순한 한 라인 텍스트 박스
ListBox 리스트 박스
RadioButton 옵션 버튼
Message Label과 비슷하게 텍스트 표시. Label과 달리 자동 래핑 기능이 있다.
Scale 슬라이스 바
Scrollbar 스크롤 바
Text 멀티 라인 텍스트 박스로서 일부 Rich Text 기능 제공
Menu 메뉴 Pane
Menubutton 메뉴 버튼
Toplevel 새 윈도우를 생성할 때 사용. Tk()는 윈도우를 자동으로 생성하지만 추가로 새 윈도우 혹은 다이얼로그를 만들 경우 Toplevel를 사용한다
Frame 컨테이너 위젯. 다른 위젯들을 그룹화할 때 사용
Canvas 그래프와 점들로 그림을 그릴 수 있으며, 커스텀 위젯을 만드는데 사용될 수도 있다

2. 위젯 사용

위젯은 객체를 생성하여 필요한 속성들을 지정하여 사용한다. 위젯은 부모 컨테이너와 연관하여 어떤 상대적 위치에 놓이게 되는데, 앞에 설명한 Geometry Manager를 사용하여 각 위젯의 위치를 정하게 된다.

아래 예제는 레이블 안에 이미지를 넣고 화면에 보여주는 코드로서, MyFrame 이라는 클래스를 만들고 생성자에서 필요한 위젯들을 배치하고 있다. 우선 main() 에서는 Tk 객체 root를 만들고 title()을 사용하여 윈도우 제목을 설정하고, geometry()를 사용하여 윈도우의 크기와 좌표를 정해주었다. geometry() 안의 문자열은 윈도우 크기 및 좌표를 "가로x세로+X+Y" 형식으로 표현한다. MyFrame 클래스는 Frame으로부터 상속된 파생클래스이고, 생성자에서 Label 하나를 추가하고 있다. Label은 좌표 (0,0)에 위치(place)하게 되고, 레이블 안에는 이미지를 넣고 있다. 이미지는 tkinter의 PhotoImage 클래스를 사용하고 있는데, 이 클래스는 .gif 파일 (혹은 PGM) 만을 읽을 수 있다. 다른 이미지 포맷을 사용하기 위해서는 외부 모듈을 사용해야 한다. PhotoImage() 에 이미지 파일을 적고 리턴된 객체를 레이블에 지정하면 되는데, 특히 가비지 컬렉션으로부터 삭제되는 것을 방지하기 위해 lbl.image = img 처럼 레퍼런스를 증가시켜 준다.

from tkinter import * class MyFrame(Frame): def __init__(self, master): img = PhotoImage(file='test.gif') lbl = Label(image=img) lbl.image = img # 레퍼런스 추가 lbl.place(x=0, y=0) def main(): root = Tk() root.title('이미지 보기') root.geometry('500x400+10+10') myframe = MyFrame(root) root.mainloop() if __name__ == '__main__': main()

3. 입력 화면 예제

아래 예제는 고객 데이타를 입력 받는 간단한 윈도우 샘플이다. 메인 Frame 안에 4개의 자식 Frame을 사용하였고, 각각의 자식 Frame 안에 레이블, 텍스트, 버튼 등의 위젯들을 추가하였다.

from tkinter import * from tkinter.ttk import * class MyFrame(Frame): def __init__(self, master): Frame.__init__(self, master) self.master = master self.master.title("고객 입력") self.pack(fill=BOTH, expand=True) # 성명 frame1 = Frame(self) frame1.pack(fill=X) lblName = Label(frame1, text="성명", width=10) lblName.pack(side=LEFT, padx=10, pady=10) entryName = Entry(frame1) entryName.pack(fill=X, padx=10, expand=True) # 회사 frame2 = Frame(self) frame2.pack(fill=X) lblComp = Label(frame2, text="회사명", width=10) lblComp.pack(side=LEFT, padx=10, pady=10) entryComp = Entry(frame2) entryComp.pack(fill=X, padx=10, expand=True) # 특징 frame3 = Frame(self) frame3.pack(fill=BOTH, expand=True) lblComment = Label(frame3, text="특징", width=10) lblComment.pack(side=LEFT, anchor=N, padx=10, pady=10) txtComment = Text(frame3) txtComment.pack(fill=X, pady=10, padx=10) # 저장 frame4 = Frame(self) frame4.pack(fill=X) btnSave = Button(frame4, text="저장") btnSave.pack(side=LEFT, padx=10, pady=10) def main(): root = Tk() root.geometry("600x550+100+100") app = MyFrame(root) root.mainloop() if __name__ == '__main__': main()

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.


Toplist

최신 우편물

태그