[Tkinter] Tkinter 시작하기(Hello world)

반응형
    반응형

    Tkinter를 이용해 GUI를 만들어봅시다.

     

    화면상에 'Hello World' 를 띄어보겠습니다.

     

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    label= ttk.Label(root,text='Hello World')
    label.pack()
    root.mainloop()

     

     

    코드 설명


    root = Tk() : 기본 오브젝트로 창을 하나 만듭니다. 메인 창으로 나타납니다. 

    label = ttk.Label(root, text='Hello World') : Tkinter에서는 텍스트 오브젝트를 Label이라고 합니다. 텍스트는 ttk 모듈에서 만들 수 있어서  ttk.Label(대상, text='원하는텍스트')으로 ttk 안에서 메쏘드 실행을 합니다. 그러면 위 그림처럼 텍스트라 나타납니다. 

    label.pack() : pack() 메쏘드를 자주 쓰게 되는데 pack()은 기본 오보젝트에 놓겠다는 의미입니다. pack을 실행하지 않으면 label이 root에 그려지지 않습니다.

     

    pack() 제거 후 실행


    root.mainloop() : 창을 띄우거나 어떤 사건을 발생시키는 것을 event loop라고 합니다. 보통 코드를 실행시키면 일을 수행하면 코드 수행을 마치고 자동으로 꺼지게 되는데 event loop로 지정을 하면 대기상태로 있게 됩니다.
    창을 띄울려면 main event loop를 실행시켜야 합니다. event loop로 지정하지 않으면 코드수행을 하고 끄는 작업을 하게 되어 창을 유지할 수가 없습니다. event loop의 자세한 소개는 추후에 포스팅을 하겠습니다.

     

     

     

    유기적인 동작

    간단한 GUI를 해보았는데 프로그램이 되려면 좀 더 복잡한 모양을 구사해야합니다. 

    하나의 유기체처럼 서로가 상호작용을 해야하기 때문에 class로써 구현을 합니다. 

    또한, class 내에서도 짜임새 있게 구조를 만들어 놓아야 오류가 나거나 수정사항이 있으면 바로바로 고쳐나갈 수 있습니다. 

     

    간단한 예제를 보인 후 포스팅을 마무리하겠습니다.

    위에 보인 라벨 글씨를 바꾸는 버튼을 만드는 예제입니다.

     

    전체코드

    #========== import ============
    import tkinter as tk
    from tkinter import ttk
    
    #=========== fuction ==========
    class Hello_fuction(tk.Frame):
        def __init__(self, parent, *args, **kwargs):
            super().__init__(parent, *args, **kwargs)
    
            self.name = tk.StringVar()
            self.hello_string = tk.StringVar()
            self.hello_string.set("Hello World")
    
            name_label = ttk.Label(self, text="Name:")
            name_entry = ttk.Entry(self,textvariable=self.name)
            ch_button = ttk.Button(self, text="Change", command=self.change_button)
            hello_label = ttk.Label(self, textvariable=self.hello_string,
                font=("TkDefaultFont", 30), wraplength=600)
    
            # Layout form
            name_label.grid(row=1, column=0, sticky=tk.W)
            name_entry.grid(row=1, column=1, sticky=(tk.W + tk.E))
            ch_button.grid(row=1, column=2, sticky=tk.E)
            hello_label.grid(row=0, column=0, columnspan=3)
            self.columnconfigure(1, weight=1)
    
        def change_button(self):
            if self.name.get().strip():
                self.hello_string.set("Hello " + self.name.get())
            else:
                self.hello_string.set("Hello World")
    
    #============== App ==================
    class MyApplication(tk.Tk):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    
            #main window
            self.title("Hello Tkinter")
            self.geometry("500x300")
            self.resizable(width=False, height=False)
    
            # Define the UI
            Hello_fuction(self).grid(sticky=(tk.E + tk.W)) # 좌우 꽉 차게 설정
            self.columnconfigure(0, weight=1)
    
    #============= Mainloop =============
    if __name__ == '__main__':
        app = MyApplication()
        app.mainloop()

     

    실행시키면 다음과 같이 나옵니다.

     

    entry에 이름을 넣고 Change 버튼을 누르면 다음과 같이 바뀝니다.

     

     

    코드설명

     

    Hello_fuction : 기능을 넣는 클래스를 만들었습니다. tk.Frame의 것을 상속(super)받아서 초기값으로 잡고 Hello world 라벨과 빈칸(Entry,StringVar()), 버튼(ch_button)을 넣어놓습니다. 

    버튼의 기능은 빈칸에 글자를 넣으면 Hello 뒤에 붙여지게끔 하기 위해 change_button 이라는 함수를 추가합니다.

     

    MyApplication : 메인창 클래스입니다. tk.Tk()에서 상속받아 초기값을 생성합니다. 처음에 화면이 뜨면 나올 수 있는 초기값들을 설정합니다. 

     

    if __name__ == '__main__': mainloop() 를 지정하는 곳입니다. 여기를 실행시키면 위에서 정한 클래스대로 화면이 나오고 기능을 수행하게 됩니다.

     


     

    클래스로 코드를 만들면 기능을 넣는 곳과 메인창을 따로 떨어뜨리는게 좋습니다.

    그리고 어디서부터 시작하는지 나름의 표현을 해야합니다.

    저는 #=====# 으로 표현을 해서 구분을 지었습니다.

    코드에는 다양한 기능을 썼는데 모두 설명하면 글이 난잡해질 것 같아 기능에 대한 포스팅을 추후에 주제별로 하겠습니다.

     

     

    참고문헌 

    1.  Python GUI Programming cookbook
    2.  Python GUI Programming - A Complete Reference Guide

     

    관련 포스팅

    [Python/기초] - [Python] 클래스 선언과 상속

     

     

    댓글

    Designed by JB FACTORY

    ....