기본 콘텐츠로 건너뛰기

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

 

댓글

이 블로그의 인기 게시물

드래곤즈 도그마 일본어 음성 패치

드래곤즈 도그마는 캡콤의 오픈월드 RPG 게임으로 액션성이 매우 뛰어난 게임입니다. 이 게임은 원래 콘솔게임이었고 일본어와 일본음성이 존재했으나, 스팀에서 판매되는 PC 판의 경우 일본어는 제외되어 있습니다. 하지만, 능력자들이 음성의 일본어 패치를 제작하여 배포하고 있습니다.   http://www.nexusmods.com/dragonsdogma/mods/108/? 제 경우는 일본어를 거의 못하지만 간단한 게임용 일본어 정도는 알아듣기에 일본어쪽이 게임에 좀더 몰입할 수 있었습니다. 그리고 개인적인 의견으로는 일본어 더빙쪽이 조금 더 잘 되어 있는것 같습니다. 영어가 더 익숙하신 분들은 반대일 수도 있겠지만요. 설치 방법은 다음과 같습니다. 1. 위의 파일을 받아 압축을 푼 후에 스팀 게임 설치 디렉토리로 이동합니다. 2. "SteamApps\common\DDDA" 위치에 모두 복사해 넣으세요. 중복되는 파일은 덮어 씌우시고요. 3. "nativePC\rom" 폴더로 이동하여 patchall.bat 파일을 실행하면 창이 하나 뜨면서 패치가 시작됩니다. 4. 패치완료후에 창을 닫고 게임을 즐기면 됩니다. ^^; 주의 하실 점은, 이 패치는 기존의 영어음성을 덮어 씌우는 형식입니다. 따라서 영어음성으로 다시 바꾸시려면 무결성 검사로 게임을 원본으로 되돌려야 합니다. 음성을 따로 영어/일어 로 선택하여 즐기실 수는 없습니다.

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(box_rotate, key=lambda p: p[1])[1])       #calculate the translation of the pivot       pivot        = pygame.math.Vector2(originPos[0], -originPos[1])     pivot_rotate = pivot.rotate(angle)     pivot_move   = piv

드래곤 에이지 인퀴지션 초반 진행 소감

얼마전에 드래곤 에이지 인퀴지션을 구입해서 초반 진행해 보았습니다.  결론부터 말하자면 초반 진행 해본 바로는....저에겐 별로네요.... > 일단 맵이 쓸데 없이 복잡합니다. 지형이 좀 복잡해서 특정지역을 가려면 어디로 가야할지 그 위치로 가는 길을 찾아서 좀 헤매야 합니다. 가령 바로 위가 목적지이긴 한데 언덕위라 못올라갑니다. 그러면 저 위를 어떻게 가야 하나 맵을 돌아다니며 길을 찾아야 하는 그런식입니다. 뭐...이 맵 자체가 던전이라고 생각하면 그러려니 싶긴 하지만.... > 맵을 돌아야 하는 이유는 균열을 봉인하기 위해서 입니다. 그렇게 균열을 막으러 다니다 서브퀘스트를 받게 되는 경우가 있는데 이게 너무 무성의 하고 의미없습니다.  가령 맵을 돌다가 시체를 보고 거기서 문서 한장을 발견한다던가, 집이 있어 들어가 보니 문서한장이 있고 이 문서를 읽고 서브퀘가 발동하는 식인데 딱히 할 맘이 안듭니다. 그런데 이런 경우가 너무 많습니다. 서브퀘 내용도 그다지..... 양산형 퀘스트가 이 게임만 그런건 아니지만...이 재미 없는 양산형 퀘스트를 계속 해야 하나 말아야 하나 고민되는 군요. 그냥 메인 퀘스트만 쭉 따라가기엔....렙 업도 그렇고..... 전투도 일단 그냥 그렇습니다. 동료들의 행동방법을 어느정도 정해 줄 수 있는데 명령 설정도 4가지 밖에 지정해 줄 수가 없어서 섬세한(?) 설정도 어렵습니다.  > 어디까지나 초반이고 좀 진행하면 어떨지 모르겠지만 일단은 의미없고 재미없는 서브퀘스트 하다보니 고민이 좀 되네요.  구입전에 알아봤을땐, 이 게임도 호불호가 좀 갈리는 게임이던데 아직까진 저에겐 불호인 게임입니다. 좀 쉬었다가 나중에 다시 해 봐야 겠습니다.