[Tkinter] 기본 위젯

반응형
    반응형

    Tkinter의 기본 위젯입니다. 

    기본 위젯으로는

    Entry, Spinbox, Combobox, Checkbutton,Radiobutton, Text widget, Button, LabelFrame으로 8개입니다.

     

     


    IntVar,DoubleVar,StringVar,BooleanVar

    위젯 소개 전에 var의 정수,소수,문자열,부울를 어떻게 표현하는지만 설명하고 넘어가겠습니다.

    tkinter에서 타입 설정을 하려면 IntVar,DoubleVar,StringVar,BooleanVar로 설정합니다.

    IntVar는 정수, DoubleVar는 소수, StringVar는 문자열, BooleanVar는 부울개체입니다.

    GUI를 만들때 Var 설정을 해주고 연결지어서 객체를 만들게 됩니다.


     

     

    Entry

    Entry는 빈칸 한 줄을 만들어 줍니다.

     

    import tkinter as tk
    from tkinter import ttk
    
    # Entry #
    root = tk.Tk()
    text_var = tk.StringVar()
    entry = ttk.Entry(root,textvariable=text_var)
    entry.pack()
    root.mainloop()

     

     

    ttk.Entry 파라미터를 설명하면 메인창(root)에 넣을 것이고 textvariable은 text_var 로 연결해서 문자열로 나오게 하겠다는 의미입니다.

    제가 text_var에 뭔가 써놓으면 Entry에 그대로 나오게 됩니다.

    textvariable은 선택사항이고 없어도 위와 같이 창이 만들어집니다.

    주로 쓰는 걸 알려주기 위해서 textvariable을 써넣었습니다.

     

    tk.StringVar()에 글자를 넣고 싶다면 set 메쏘드를 붙여서 값을 넣어주어야 합니다.

    tk.StringVar() 는 문자열타입처럼 쓰는게 아니기 때문에 반드시 set()을 붙여주어야 합니다.

     

    ## Entry
    root = tk.Tk()
    text_var = tk.StringVar()
    entry = ttk.Entry(root,textvariable=text_var)
    text_var.set('Hello world')                       #'Hello world' 추가
    entry.pack()
    root.mainloop()

     

    메인창이 뜨면 Hello world 가 나온 상태로 시작됩니다. 

    tk. StringVar()를 정의한 text_var에 set 메쏘드를 넣어서 Hello world를 썼습니다.

    자동으로 안에 들어가는 글자를 바꾸고 싶다면 set메쏘드를 이용해 바꿀 수 있게 설계를 하면 되겠습니다.

     

     

    Spinbox 

    spinbox는 Entry에 값을 증가감소를 시킬수 있는 선택바(?)가 옆에 부착되는 위젯입니다.

    소수점을 하나씩 올리는 Spinbox를 만들어보겠습니다.

     

    ## Spinbox
    root = tk.Tk()
    my_double_var = tk.DoubleVar()
    spinbox = tk.Spinbox(root,from_ =0.5, to=50.0, increment=.1, textvariable=my_double_var)
    spinbox.pack()
    root.mainloop()

     

     

    소수점으로 움직여야 하기 때문에 DoublVar()를 넣어줬고 파라미터에서 from_ 은 처음시작을 to 는 맨 끝, increment는 증감범위입니다.

     

     

    Combobox

    Combobox는 drop-down select menu인데 원하는 옵션을 선택하는 위젯입니다.

     

    ## Combobox
    root = tk.Tk()
    string = tk.StringVar()
    combobox = ttk.Combobox(root,textvariable=string,values=['Type A','Type B','Type C'])
    combobox.pack()
    root.mainloop()

     

     

    파라미터의 values에 원하는 값을 리스트로 넣어주면 됩니다.

     

     

    Checkbutton

    Checkbutton은 체크박스를 만드는 위젯입니다.

     

    ##Checkbutton
    root = tk.Tk()
    boolean = tk.BooleanVar()
    
    checkbutton = ttk.Checkbutton(text="Check for Option",variable=boolean)
    checkbutton.pack()
    root.mainloop()

     

     

    Checkbutton는 변수를 BoolenanVar() 로 해놓았습니다.

    자신이 만들고자 하는 GUI에 따라 달라질 수 있으니 잘 생각하셔서 어울리는 변수를 설정하시기 바랍니다.

     

     

    Radiobutton

    Radiobutton은 Checkbox 와 비슷한데 Checkbox는 중복체크가 가능하지만 Radiobutton은 한개만 체크할 수 있습니다.

     

    ##Radiobutton
    root = tk.Tk()
    radVar = tk.IntVar()
    rad1 = tk.Radiobutton(root, text='Blue', variable=radVar, value=1)
    rad1.grid(column=0,row=0)
    rad2 = tk.Radiobutton(root, text='Red',variable=radVar,value=2)
    rad2.grid(column=0,row=1)
    root.mainloop()

     

    pack을 하지 않고 grid로 위치설정 해주어도 메인창에 뜨게 됩니다.

     

     

    Text widget

    Text widget은 여러줄로 되어 있는 쓸수 있는 창을 만드는 위젯입니다.

    앞서서는 StringVar를 설정했는데 여기서는 get(),insert(), delete() 메쏘드를 씁니다.

     

    ##Text widget
    root = tk.Tk()
    mytext = tk.Text(root)
    mytext.insert('1.0','Hello world!!')
    mytext.insert('1.6','Tkinter ')
    mytext.get('1.0',tk.END)
    mytext.delete('end-2 chars')
    mytext.pack()
    root.mainloop()

     

    Text widget에서는 소수로 위치를 정하는데 '1.0' 이라고 하면 첫번째 줄을 의미합니다.

    '1.5' 라고 하면 '첫번째 줄의 다섯번째' 라는 뜻입니다.

    위의 예를 보면 제가 1.6에 Tkinter를 추가했습니다. 6번째가 Hello+빈칸 입니다.

    빈칸 이후에 Tkinter 써지는 걸 볼 수 있고

    글자를 지우고 싶을 때 항상 알아두어야 하는건 이 위젯은 마지막에 항상 새로운 줄이 있습니다.

    즉, 제가 첫번째 줄에 글자를 썼지만 두번째 줄도 존재하는 것입니다.

    그래서 하나 더 지워야 합니다. 

    마지막 글자를 지우기 위해서는 'end - 2 chars' 로 써 주어야 합니다.

     

     

    Button

    버튼을 만드는 위젯입니다. 

     

    ##Button
    root = tk.Tk()
    string = tk.StringVar()
    def change():
        if string.get() =='Hi':
            string.set('Hello')
        else:
            string.set('Hi')
    
    button = ttk.Button(root, textvariable=string,command=change)
    button.pack()
    root.mainloop()

     

     

    버튼을 누르면 Hi 와 Hello가 번갈아 나오게 했습니다.

    command에 원하는 함수를 넣어서 잘 동작할 수 있도록 트리거 역할을 하게 됩니다.

     

     

    LabelFrame

    메인창에 구분선을 짓는 위젯입니다. GUI를 한결 깔끔하게 만들 수 있어서 아주 좋습니다.

     

    ##LabelFrame
    root= tk.Tk()
    labelframe = ttk.LabelFrame(root,text='LabelFrame')
    labelframe.grid(column=0,row=0)
    label1 = ttk.Label(labelframe,text='Label1').grid(column=0,row=0)
    root.mainloop()

     

    grid로 위치를 잡아서 구분선을 만들 수 있습니다.

     

     

     

    참고문헌

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


    관련포스팅

    [Python/GUI] - [Tkinter] Tkinter 시작하기(Hello world)

    댓글

    Designed by JB FACTORY

    ....