기본 콘텐츠로 건너뛰기

tkinter 기본 위젯 사용예

 

그냥 tkinter 가 어떻게 쓰이는지 기본적인 작동을 하도록 만들어 본 것 입니다. 기본 골격은 파이썬 도큐먼트에 있는 예제 소스에서 가져왔고 거기에 살을 좀 붙였습니다.

가장 많이 쓰는 Label 과 버튼, 에디트 컨트롤의 기본적인 사용예 입니다.

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

class Application(ttk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack(side="top")
        self.create_widgets()

    def create_widgets(self):
        style = ttk.Style()        #style 설정
        style.configure("BW.TLabel", foreground="black", background="white")
        
        self.l1 = ttk.Label(text = "Label1", style = "BW.TLabel")
        self.l1.pack(side="top")
        
        self.textEntry = tk.StringVar() #파이썬의 String을 그냥 못쓰기때문에 tk의 String을 사용
        e1 = ttk.Entry(textvariable = self.textEntry)
        e1.pack()
        e1.bind("<Return>",self.message)    #enter 키를 눌렀을때 message 함수 호출
        
        b1 = ttk.Button(text="set", command=self.setLabel)#버튼을 눌렀을때 setLabel 함수 호출
        b1.pack()

    def message(self,event):
        messagebox.showinfo("Infomation","Set 버튼을 누르세요") #메시지 박스
        
    def setLabel(self):
        self.l1.configure(text = self.textEntry.get())#에디트컨트롤에 적은 문자를 Label 에 적용

root = tk.Tk()
root.title("tk 테스트")              #윈도우 타이틀
root.geometry("300x100+500+500")    #윈도우의 가로x세로+x좌표+y좌표
app = Application(master=root)
app.mainloop()

 위에서 tkinter.ttk 를 import 하고 기존의 tk 위젯대신 ttk 위젯을 사용했습니다. ttk 는 기존 tk 위젯 여럿을 대체할 수 있고, tk 에 없는 ttk 전용 위젯이 몇가지 추가 됩니다.

ttk 위젯은 위의 ttk.Style 클래스를 이용하여 위젯의 모양을 꾸밀 수 있고요. 저건 아주 기본적인 예이고 본격적으로 하자면 좀 복잡합니다.

파이썬에서 tkinter 를 이용할때 직접적으로 위젯에 파이썬 String 등을 사용할 수 없기 때문에 tk.StringVar 와 같은 클래스를 사용하게 됩니다. 위 소스에서 보면 tk.StringVar 의 객체를 ttk.Entry(에디트 컨트롤) 의 인자로 넘기고 있습니다.

위젯은 이벤트 처리에 bind 를 이용할 수 있습니다. 키 입력과 같은 복잡한 이벤트 처리는 bind 를 이용합니다.

아래의 소스는 위의 소스와 동일하게 작동합니다.

from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *

class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack(side="top")
        self.create_widgets()

    def create_widgets(self):
        style = Style()
        style.configure("BW.TLabel", foreground="black", background="white")
        
        self.l1 = Label(text = "Label1", style = "BW.TLabel")
        self.l1.pack(side="top")
        
        self.textEntry = StringVar()
        e1 = Entry(textvariable = self.textEntry)
        e1.pack()
        e1.bind("<Return>",self.message)
        
        b1 = Button(text="set", command=self.setLabel)
        b1.pack()

    def message(self,event):
        showinfo("Infomation","Set 버튼을 누르세요")
        
    def setLabel(self):
        self.l1.configure(text = self.textEntry.get())

root = Tk()
root.title("tk 테스트")
root.geometry("300x100+500+500")
app = Application(master=root)
app.mainloop()

차이는 import 문으로 위와 같이 사용하는 경우에는 ttk 위젯을 tk 위젯대신 사용하려면 tk -> ttk 의 import 순서를 지켜야 합니다.

나머지 위젯은 파이썬 도큐먼트나 검색을 해서 사용하면 될 겁니다. 지금 생각엔 시간이 남을때 마다 위젯을 하나씩 써 볼 생각이긴 합니다만....이런 위젯들의 사용방법은 대부분 예제를 보면 알 수 있는 정도니 뭐.....


에디트 컨트롤에 글자를 입력하고 Enter 를 누르면 Set 버튼을 누르라는 메시지가 나올거고 set 버튼을 누르면 Entry 에 입력한 내용이 Label1 에 입력 될 것 입니다. 별다른 의미 없고 아주 간단한 예 입니다.

 

댓글

이 블로그의 인기 게시물

pygame 에서 이미지 회전하는 방법

 pygame 에서 transform.rotate 를 사용해서 이미지를 회전시켜 보면 생각과는 달리 요상하게 회전합니다.    따라서 이를 해결해 보고자 검색해 보다 다음 링크를 찾았습니다. https://stackoverflow.com/questions/4183208/how-do-i-rotate-an-image-around-its-center-using-pygame/54714144 위 링크를 보면 파이게임의 이미지 회전이 왜 그렇게 이상한지 알 수 있고 답변하신 분이 blitRotate 라는 함수를 만들어 놓아서 이용할 수 있습니다.  제 소스에 가져와서 테스트를 해 봤는데 제 생각대로 회전 하더군요.  def blitRotate(image, pos, originPos, angle):       #calcaulate the axis aligned bounding box of the rotated image     w, h       = image.get_size()     box        = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]     box_rotate = [p.rotate(angle) for p in box]     min_box    = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])     max_box    = (max(box_rotate, key=lambda p: p[0])[0], max...

antix linux 업데이트시 GPG Error

 최근에 가장 가벼운 리눅스를 검색해서 antix 리눅스를 설치해서 테스트 해 보고 있습니다. 역시 가볍긴 가볍더군요. 생각보단 패키지 구성도 괜찮아 보였고요.    설치후 좀 써보고 업데이트를 하는데 GPG Error 가 발생했습니다. GPG 키 관련 문제인것 같아서 검색해 보니 antixforum에 답이 있었습니다.  https://www.antixforum.com/forums/topic/how-to-fix-expired-gpg-key-error/   간단히 적어보자면... http://repo.antixlinux.com/bookworm/pool/main/a/antix-archive-keyring/antix-archive-keyring_20019.5.0_all.deb 위 파일을 받은 다음에 터미널에서... sudo dpkg -i antix-archive-keyring_20019.5.0_all.deb 을 실행해서 설치해 주면 됩니다.    그런다음 업데이트를 시도해 보면 잘 됩니다.   

모닝 JA 엔진오일 교환. 보쉬필터 구입

요즘은 주행거리가 1만km 가 안되다보니 1년에 한번씩 엔진오일을 교환하고 있습니다.  1년에 한번이라 그냥 오토큐에서 교환을 했었지만 오토큐의 오일교환 가격이 너무 오른데다가 이젠 보증도 끝났기 때문에 오일과 필터를 구입해서 공임나라로 갔습니다.  > 오일은 kixx g1 fe 1L x 3 을 구입하고 필터는 보쉬제품으로 구입했습니다.   A3003 이 에어필터이고 O0356 이 오일필터 입니다. 기아의 순정부품보단 조금 가격이 저렴합니다.  > 오랜만에 공임나라 갔는데 교환공임이 17000원 이네요. 물가가 오른만큼 오일교환 비용도 예전보다 좀 올랐네요.  필터 품번도 기록해 둘겸 올려 봅니다. ^^;