위젯은 위도창에 나올 수 있는 문자, 버튼, 체크박스, 라디오 버튼 등을 의미한다.

 

필수

Code10-01.py

from tkinter import *

window = Tk()

##이 부분에서 화면을 구성하고 처리##

window.mainloop() ##필수

기본적인 윈도창의 구성이다.

 

-tkinter는 gui 관련 보듈을 제공해주는 표준 위도 라이브러리이다.

-window = tk()르 통해 윈도창이 화면에 출련된다.

-window.mainloop()는 다양한 이벤트를 처리하는데 필요

 

 

Code10-02.py

from tkinter import *

window = Tk()
window.title("윈도우 연습")
window.geometry("400x100")
window.resizable(width = False, height = False) #크기 변동x

##이 부분에서 화면을 구성하고 처리##

window.mainloop() ##필수

 

레이블

Code10-03.py

from tkinter import *
window = Tk()

label1 = Label(window, text = "COOKBOOK~~Pytthon을")
label2 = Label(window, text = "열심히", font=("궁서체", 30), fg = "blue") 
label3 = Label(window, text = "공부 중입니다.", bg = "magenta", width = 20, height=5, anchor = SE) 


label1.pack()
label2.pack()
label3.pack()

window.mainloop() ##필수

-레이블 =문자를 표현하는 위젯

-Label(부모윈도, 옵션...)

-레이블 같은 위젯은 .pack()함수를 호출해야한다.

-anchor는 위젯의 위치

 

Code10-04.py

from tkinter import *
window = Tk()

photo = PhotoImage(file= "C:/tukdata/ch10/image/GIF/dog.gif")
label1 = Label(window, image = photo)

label1.pack()

window.mainloop() ##필수

-글자 대신 이미지가 들어갔다.

 

selfstudy10-4.py

from tkinter import *
window = Tk()

# 첫 번째 이미지
photo1 = PhotoImage(file="C:/tukdata/ch10/image/GIF/dog.gif")
label1 = Label(window, image=photo1)
label1.pack(side=LEFT)

# 두 번째 이미지
photo2 = PhotoImage(file="C:/tukdata/ch10/image/GIF/dog2.gif") 
label2 = Label(window, image=photo2)
label2.pack(side=LEFT)

window.mainloop()

 

 

버튼

Code10-05.py

from tkinter import *
window = Tk()

button1 = Button(window, text = "파이썬 종료", fg = "red", command = quit)

button1.pack()

window.mainloop() ##필수

-마우스 버튼을 누르면 효과가 실행되는 위젯

-command 옵션은 버튼을 눌렀을때 지정한 작업을 처리할 수 있다.

 

 

Code10-06.py

from tkinter import *
from tkinter import messagebox

##함수 선언 부분##
def myFunc() :
    messagebox.showinfo("강아지 버튼", "강아지가 귀엽죠? ^^")

##메인코드 부분##
window = Tk()

photo = PhotoImage(file= "C:/tukdata/ch10/image/GIF/dog2.gif")
button1 = Button(window, image = photo, command = myFunc)


button1.pack()

window.mainloop() ##필수

 

 

체크버튼

Code10-07.py

from tkinter import *
from tkinter import messagebox
window = Tk()

##함수 선언 부분##
def myFunc() :
    if chk.get() == 0 :
        messagebox.showinfo("", "체크버튼이 꺼졌어요.")
    else :
        messagebox.showinfo("", "체크버튼이 켜졌어요.")

##메인코드 부분##
chk = IntVar()
cb1 = Checkbutton(window, text = "클릭하세요", variable = chk ,command = myFunc)

cb1.pack()

window.mainloop() ##필수

-intvar함수는 정수형 타입의 변수 생성

-체크버튼을 키면 chk 1대입 끄면 0 대입

 

라디오버튼

Code10-08.py

from tkinter import *
window = Tk()

##함수 선언 부분##
def myFunc() :
    if var.get() == 1 :
        label1.configure(text = "파이썬")
    elif var.get() ==2 :
        label1.configure(text = "C++")
    else :
        label1.configure(text = "java")

##메인코드 부분##
var = IntVar()
rb1 = Radiobutton(window, text = "파이썬", variable = var, value=1, command = myFunc)
rb2 = Radiobutton(window, text = "C++", variable = var, value=2, command = myFunc)
rb3 = Radiobutton(window, text = "java", variable = var, value=3, command = myFunc)

label1 = Label(window, text = "선택한 언어 : ", fg = "red")

rb1.pack()
rb2.pack()
rb3.pack()
label1.pack()

window.mainloop() ##필수

 

정렬

Code10-09.py

from tkinter import *
window = Tk()

button1 = Button(window, text = "버튼1")
button2 = Button(window, text = "버튼2")
button3 = Button(window, text = "버튼3")

button1.pack(side=LEFT)
button2.pack(side=LEFT)
button3.pack(side=LEFT)

window.mainloop() ##필수

-pack() 함수 옵션에서 side = 사용하면 된다.

 

Code10-10.py

from tkinter import *
window = Tk()

btnList = [None]*3

for i in range(0, 3) :
    btnList[i] = Button(window, text = "버튼" + str(i+1))

for btn in btnList :
    # btn.pack(side = RIGHT)
    btn.pack(side = RIGHT, fill =X, ipadx = 10, ipady = 10, padx = 10, pady = 10)

window.mainloop() ##필수

 

Code10-11.py

from tkinter import *

##전역 변수 선언 부분##
btnList = [None]*9
fnameList = ["honeycomb.gif", "icecream.gif", "jellybean.gif", "kitkat.gif", "lollipop.gif", "marshmallow.gif", "nougat.gif", "oreo.gif", "pie.gif"]
photoList = [None]*9
i,k=0,0
xPos,yPos = 0,0
num = 0

##메인 코드 부분##
window = Tk()
window.geometry("210x210")

for i in range(0, 9) :
    photoList[i] = PhotoImage(file = "ch10/image/GIF/" + fnameList[i])
    btnList[i] = Button(window, image=photoList[i])

for i in range(0, 3) :
    for k in range(0,3) :
        btnList[num].place(x = xPos, y = yPos)
        num += 1
        xPos += 70
    xPos =0
    yPos += 70

window.mainloop() ##필수

 

-수평 side = left or right

-수직 = top or bottom

-폭조정 fill = x

-여백 = padx= 10 or pady = 10

-내부여백 ipadx = 10

고정위치 -> .place() 함수 사용

 

 

selfstudy10-2.py

from tkinter import *
import random  # 랜덤 모듈 임포트

# 전역 변수 선언 부분
btnList = [None] * 9
fnameList = ["honeycomb.gif", "icecream.gif", "jellybean.gif", "kitkat.gif", "lollipop.gif", 
             "marshmallow.gif", "nougat.gif", "oreo.gif", "pie.gif"]
photoList = [None] * 9
i, k = 0, 0
xPos, yPos = 0, 0
num = 0

# 리스트를 랜덤하게 섞음
random.shuffle(fnameList)

# 메인 코드 부분
window = Tk()
window.geometry("210x210")

for i in range(0, 9):
    photoList[i] = PhotoImage(file="ch10/image/GIF/" + fnameList[i])
    btnList[i] = Button(window, image=photoList[i])

for i in range(0, 3):
    for k in range(0, 3):
        btnList[num].place(x=xPos, y=yPos)
        num += 1
        xPos += 70
    xPos = 0
    yPos += 70

window.mainloop()

 

Code10-12.py

from tkinter import *
from time import *

# 전역 변수 선언 부분
frameList = ["jeju1.gif", "jeju2.gif", "jeju3.gif", "jeju4.gif", "jeju5.gif", "jeju6.gif", "jeju7.gif", "jeju8.gif", "jeju9.gif"]
photoList = [None] * 9
num = 0

# 함수 선언 부분
def clickNext():
    global num
    num += 1
    if num > 8:
        num = 0
    photo = PhotoImage(file="ch10/image/GIF/" + frameList[num])
    pLabel.configure(image=photo)
    pLabel.image = photo

def clickPrev():
    global num
    num -= 1
    if num < 0:
        num = 8
    photo = PhotoImage(file="ch10/image/GIF/" + frameList[num])
    pLabel.configure(image=photo)
    pLabel.image = photo

# 메인 코드 부분
window = Tk()
window.geometry("700x500")
window.title("사진 앨범 보기")

btnPrev = Button(window, text="« 이전", command=clickPrev)
btnNext = Button(window, text="다음 »", command=clickNext)

photo = PhotoImage(file="ch10/image/GIF/" + frameList[0])
pLabel = Label(window, image=photo)

btnPrev.place(x=250, y=10)
btnNext.place(x=400, y=10)
pLabel.place(x=15, y=50)

window.mainloop()

 

selfstudy10-3.py

from tkinter import *
from time import *

# 전역 변수 선언 부분
frameList = ["jeju1.gif", "jeju2.gif", "jeju3.gif", "jeju4.gif", "jeju5.gif", 
             "jeju6.gif", "jeju7.gif", "jeju8.gif", "jeju9.gif"]
photoList = [None] * 9
num = 0

# 함수 선언 부분
def clickNext():
    global num
    num += 1
    if num > 8:
        num = 0
    updateImage()

def clickPrev():
    global num
    num -= 1
    if num < 0:
        num = 8
    updateImage()

def updateImage():
    # 이미지 업데이트
    photo = PhotoImage(file="ch10/image/GIF/" + frameList[num])
    pLabel.configure(image=photo)
    pLabel.image = photo
    # 파일명 업데이트
    fileNameLabel.config(text=frameList[num])

# 메인 코드 부분
window = Tk()
window.geometry("700x500")
window.title("사진 앨범 보기")

btnPrev = Button(window, text="« 이전", command=clickPrev)
btnNext = Button(window, text="다음 »", command=clickNext)

photo = PhotoImage(file="ch10/image/GIF/" + frameList[0])
pLabel = Label(window, image=photo)

# 파일명 표시용 라벨 추가
fileNameLabel = Label(window, text=frameList[0], font=("Arial", 12))
fileNameLabel.place(x=320, y=15)

btnPrev.place(x=250, y=10)
btnNext.place(x=400, y=10)
pLabel.place(x=15, y=50)

window.mainloop()

 

 

 

마우스 이벤트 처리

def 이벤트처리함수(event):
	#이 부분에 마우스 이벤트가 발생할 때 작동할 내용 작성
    
위젯.bind("마우스이벤트", 이벤트처리함수)

 

Code10-13.py

from tkinter import *
from tkinter import messagebox

#함수 선언 부분
def clickLeft(event):
    messagebox.showinfo("마우스", "마우스 왼쪽 버튼이 클릭됨")

##이 부분에서 화면을 구성하고 처리##
window = Tk()

window.bind("<Button-1>", clickLeft)

window.mainloop() ##필수

 

 

Code10-14.py

from tkinter import *
from tkinter import messagebox

#함수 선언 부분
def clickImage(event):
    messagebox.showinfo("마우스", "토끼에서 마우스가 클릭됨")

##이 부분에서 화면을 구성하고 처리##
window = Tk()
window.geometry("400x400")

photo = PhotoImage(file = "ch10/image/GIF/rabbit.gif")
label1 = Label(window, image = photo)


label1.bind("<Button>", clickImage)

label1.pack(expand = True, anchor = CENTER)

window.mainloop() ##필수

-label.bind로 이미지를 클릭할 때만 이벤트 처리된다(window.bind면 위젯 자체)

 

 

Code10-15.py

from tkinter import *

#함수 선언 부분
def clickMouse(event):
    txt = ""
    if event.num == 1:
        txt += "마우스 왼쪽 버튼이 ("
    elif event.num == 3:
        txt += "마우스 오른쪽 버튼이 ("

    txt += str(event.y) + "," + str(event.x) + ")에서 클릭됨"
    label1.configure(text = txt)

#메인 코드 부분##
window = Tk()
window.geometry("400x400")

label1 = Label(window, text= "이곳이 바뀜")

window.bind("<Button>", clickMouse)

label1.pack(expand = True, anchor = CENTER)
window.mainloop() ##필수

 

 

 

키보드 이벤트 기본처리

Code10-16.py

from tkinter import *
from tkinter import messagebox

#함수 선언 부분
def keyEvent(event):
    messagebox.showinfo("키보드 이벤트", "눌린 키 : " + chr(event.keycode))

#메인 코드 부분##
window = Tk()

window.bind("<Key>", keyEvent)

window.mainloop() ##필수

-.event.keycode에 눌려진 키의 숫자값이 chr()함수를 사용해서 문자로 변환시켰다

 

 

 

selfstudy10-4.py

from tkinter import *
from tkinter import messagebox

# 함수 선언 부분
def keyEvent(event):
    # Shift 키와 화살표 키 조합에 따라 메시지 출력
    if event.keycode == 37:
        messagebox.showinfo("키보드 이벤트", "눌린 키 : Shift + 왼쪽 화살표")
    elif event.keycode == 38:
        messagebox.showinfo("키보드 이벤트", "눌린 키 : Shift + 위쪽 화살표")
    elif event.keycode == 39:
        messagebox.showinfo("키보드 이벤트", "눌린 키 : Shift + 오른쪽 화살표")
    elif event.keycode == 40:
        messagebox.showinfo("키보드 이벤트", "눌린 키 : Shift + 아래쪽 화살표")

# 메인 코드 부분
window = Tk()
# Shift와 각 화살표 키 조합에 대해 이벤트 바인딩
window.bind("<Shift-Left>", keyEvent)
window.bind("<Shift-Up>", keyEvent)
window.bind("<Shift-Right>", keyEvent)
window.bind("<Shift-Down>", keyEvent)

window.mainloop()

 

 

 

메뉴의 생성

메뉴자체 = Menu(부모윈도)
부모윈도.config(menu = 메뉴자체)

상위메뉴 = Menu(메뉴자체)
메뉴자체.add_cascade(label = "상위메뉴텍스트", menu = 상위메뉴)
상위메뉴.add_command(label = "하위메뉴1", command = 함수1)
상위메뉴.add_command(label = "하위메뉴2", command = 함수2)

 

Code10-17.py

from tkinter import *

window = Tk()

mainMenu = Menu(window) #메뉴자체 변수
window.config(menu = mainMenu) #생성한 메뉴 자체를 윈도창 메뉴로 지정

fileMenu = Menu(mainMenu) #상위 메뉴인 파일을 생성하고 메뉴 자체에 부착
mainMenu.add_cascade(label="파일", menu = fileMenu)
fileMenu.add_command(label="열기")#하위메뉴
fileMenu.add_separator()
fileMenu.add_command(label="종료")

window.mainloop() ##필수

 

Code10-18.py

from tkinter import *
from tkinter import messagebox

#함수 선언 부분
def func_open():
    messagebox.showinfo("메뉴선택", "열기 메뉴를 선택함")

def func_exit():
    window.quit()
    window.destroy()

#메인 코드 부분##
window = Tk()

mainMenu = Menu(window)
window.config(menu = mainMenu)

fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label="파일", menu = fileMenu)
fileMenu.add_command(label="열기", command = func_open)
fileMenu.add_separator()
fileMenu.add_command(label="종료", command= func_exit)

window.mainloop() ##필수

-add_command()함수: 무언가 작동

 

 

대화상자의 생성과 사용

Code10-19.py

from tkinter import *
from tkinter.simpledialog import*

#함수 선언 부분
window = Tk()
window.geometry("400x100")

label1 = Label(window, text = "입력된 값")
label1.pack()

value = askinteger("확대배수", "주사위 숫자(1~6)을 입력하세요", minvalue = 1, maxvalue = 6)

label1.configure(text = str(value))
window.mainloop() ##필수

-tkinter.simpledialog모듈 임포트

-askinteger("제목", "내용", 옵션)

 

숫자나 문자를 입력받으려면 tkinter.simpledialog 모듈을 입포트한 후 askinteger(), askfloa(), askstring()함수 등을 사용한다.

 

 

Code10-20.py

from tkinter import *
from tkinter.filedialog import*

#함수 선언 부분
window = Tk()
window.geometry("400x100")

label1 = Label(window, text = "선택된 파일 이름")
label1.pack()

filename = askopenfilename(parent=window, filetypes=(("GIF 파일", "*.gif"), ("모든 파일", "*.*")))

label1.configure(text = str(filename))

window.mainloop() ##필수

-tkinter.filedialog 임포트

-askopenfilename()함수

 

파일을 열거나 저장할 때 나타나는 대화상자는 tkinter.filedilog 모듈을 임포트한 후 askopenfilename() 또는 asksaveasfile()함수를 사용한다.

 

 

Code10-21.py

from tkinter import *
from tkinter.filedialog import*

#함수 선언 부분
window = Tk()
window.geometry("400x100")

label1 = Label(window, text = "선택된 파일 이름")
label1.pack()

saveFp = asksaveasfile(parent=window, mode= "w", defaultextension = ".jpg", filetypes = (("jpg 파일", "*.jpg;*.jpeg"), ("모든 파일", "*.*")))

label1.configure(text = saveFp)

saveFp.close() ##필수

-asksaveasfile()->다른 이름으로 저장

-mode "W"는 쓰기

 

 

 

 

Code10-22.py

from tkinter import *
from tkinter.filedialog import *

# 함수 선언 부분
def func_open():
    filename = askopenfilename(parent=window, filetypes=(("GIF 파일", "*.gif"), ("모든 파일", "*.*")))
    photo = PhotoImage(file=filename)
    pLabel.configure(image=photo)
    pLabel.image = photo

def func_exit():
    window.quit()
    window.destroy()

# 메인 코드 부분
window = Tk()
window.geometry("500x500")
window.title("명화 감상하기")

photo = PhotoImage()
pLabel = Label(window, image=photo)
pLabel.pack(expand=1, anchor=CENTER)

mainMenu = Menu(window)
window.config(menu=mainMenu)
fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label="파일", menu=fileMenu)
fileMenu.add_command(label="파일 열기", command=func_open)
fileMenu.add_separator()
fileMenu.add_command(label="프로그램 종료", command=func_exit)

window.mainloop()

 

selfstudy10-5.py

from tkinter import *
from tkinter.filedialog import *

# 함수 선언 부분
def func_open():
    filename = askopenfilename(parent=window, filetypes=(("GIF 파일", "*.gif"), ("모든 파일", "*.*")))
    if filename:
        global photo  
        photo = PhotoImage(file=filename)
        grayscale_image(photo)  
        pLabel.configure(image=photo)
        pLabel.image = photo

def grayscale_image(photo):
    width = photo.width()
    height = photo.height()

    for x in range(width):
        for y in range(height):
            r, g, b = photo.get(x, y) 
            gray = (r + g + b) // 3
            # 픽셀을 회색으로 설정
            photo.put("#%02x%02x%02x" % (gray, gray, gray), (x, y))

def func_exit():
    window.quit()
    window.destroy()

# 메인 코드 부분
window = Tk()
window.geometry("500x500")
window.title("명화 감상하기")

photo = PhotoImage()  
pLabel = Label(window, image=photo)
pLabel.pack(expand=1, anchor=CENTER)

mainMenu = Menu(window)
window.config(menu=mainMenu)
fileMenu = Menu(mainMenu)
mainMenu.add_cascade(label="파일", menu=fileMenu)
fileMenu.add_command(label="파일 열기", command=func_open)
fileMenu.add_separator()
fileMenu.add_command(label="프로그램 종료", command=func_exit)

window.mainloop()

'Language > Python' 카테고리의 다른 글

객체지향 프로그래밍  (1) 2024.12.05
파일 입출력  (0) 2024.12.05
함수와 모듈  (0) 2024.12.05
문자열  (2) 2024.10.24
리스트, 튜플, 딕셔너리  (0) 2024.10.24

+ Recent posts