기본 콘텐츠로 건너뛰기

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 에 입력 될 것 입니다. 별다른 의미 없고 아주 간단한 예 입니다.

 

댓글

이 블로그의 인기 게시물

유로트럭 시뮬레이터 2 순간이동 치트 사용방법

최근 이벤트때 운송해야 할 물건이 나오지 않아 고민중에 어떤 게임사이트에서 찾아낸 방법입니다. 이미 게임을 충분히 하신 분들은 여기저기에 창고가 이미 있을것이기 때문에 그 창고로 이동하면 되지만 그렇지 못한 분들은 지역을 이동하는것이 시간이 많이 걸립니다. 이 방법을 쓰면 특정 도시로 빠르게 이동이 가능합니다. 내문서 -> Euro Truck Simulator 2 의 config.cfg 를 사용하시는 텍스트 에디터로 수정합니다. 수정해야 할 부분은 위에 표시해 놓은 부분입니다. 원래값은 0 이며 1로 바꿔줍니다. 이제 키보드의 '~' 키를 누르면 콘솔창이 뜹니다. 위의 스크린샷이 콘솔을 띄운 화면 입니다. 위와 같이 키보드를 눌렀을때 콘솔이 뜨면 일단 준비과정은 끝납니다. 이제 순간이동 사용법을 알려드리겠습니다. 1. 숫자키 '0'을 눌러서 프리카메라 모드로 들어갑니다. 2. 'm' 키를 눌러서 이동해야 할 도시를 확인하고 도시의 이름을 외워둡니다. 3. 콘솔을 열고 'goto 도시이름' 을 입력합니다. 성공했으면 해당 도시로 바로 이동합니다. 4. 마우스와 키보드 오른쪽의 숫자키패드를 이용해서 지상으로 이동합니다. 5. Ctrl + F9 키를 눌러 트럭을 소환합니다. 위의 순서에서 4번은 주의 하셔야 합니다. 트럭은 Ctrl + F9 를 누르는 순간 카메라의 위치로 소환됩니다. 만일 지상으로 이동하지 않고 트럭을 소환하실 경우 트럭이 지상으로 추락하여 손상 100%가 될 수도 있습니다. 즐거운 게임 되시길 바랍니다.    2022 년 2월 3일 수정사항 트럭의 소환키가 F9 에서 Ctrl + F9 로 변경되었다는 걸 확인해서 본문을 수정했습니다.

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 을 실행해서 설치해 주면 됩니다.    그런다음 업데이트를 시도해 보면 잘 됩니다.   

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...