Tkinter, *args, **kwargs

JOOYEUN SEOยท2024๋…„ 9์›” 8์ผ

100 Days of Python

๋ชฉ๋ก ๋ณด๊ธฐ
27/76
post-thumbnail

๐Ÿชถ Tkinter๋กœ Windows์™€ Label ๋งŒ๋“ค๊ธฐ

Day18 - GUI์™€ Tkinter์— ๋Œ€ํ•œ ์„ค๋ช… ์ฐธ๊ณ 

pack() : ์Šคํฌ๋ฆฐ์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ

  • turtle ๋ชจ๋“ˆ ๋“ฑ๊ณผ ๋‹ฌ๋ฆฌ ๊ด„ํ˜ธ๋ฅผ ์—ด์–ด๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ์ž๋“ค์˜ ๋ชฉ๋ก์ด ๋œจ์ง€ ์•Š์Œ
  • ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์–ด๋–ค ์ž‘์—…์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
# ๋”ฐ๋กœ ์„ค์น˜ํ•  ํ•„์š” ์—†์Œ
import tkinter

# ์ƒˆ ์œˆ๋„์šฐ ๊ฐ์ฒด ์ƒ์„ฑ(ํ„ฐํ‹€ ๋ชจ๋“ˆ์˜ ์Šคํฌ๋ฆฐ๊ณผ ๊ฐ™์Œ)
window = tkinter.Tk()

window.title("My First GUI Program")
window.minsize(width=500, height=300)   # ์œˆ๋„์šฐ ๊ธฐ๋ณธ ์‚ฌ์ด์ฆˆ ์„ค์ •

# ๋ ˆ์ด๋ธ”(label) ๋งŒ๋“ค๊ธฐ = ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
my_label = tkinter.Label(text="I Am a Label", font=('Arial', 24, 'bold'))

# ์ƒ์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ช…์‹œ(๋ ˆ์ด์•„์›ƒ)
my_label.pack()


# ์œˆ๋„์šฐ๋ฅผ ์Šคํฌ๋ฆฐ์— ์œ ์ง€(ํ•ญ์ƒ ํ”„๋กœ๊ทธ๋žจ ๋งจ ๋งˆ์ง€๋ง‰์— ์œ„์น˜)
window.mainloop()

โ– ๊ณ ๊ธ‰ ํŒŒ์ด์ฌ ์ธ์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

โ—‡ ์„ ํƒ์  ์ธ์ˆ˜์— ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ

๊ธฐ๋ณธ๊ฐ’(defalt values)์„ ๊ฐ€์ง„ ์ธ์ˆ˜ โ†’ ํŠน์ • ๊ฐ’์„ ์‹œ์ž‘๊ฐ’์œผ๋กœ ์„ค์ •

# ํ•จ์ˆ˜ ์„ ์–ธ (์ธ์ˆ˜ b, c์— ๊ธฐ๋ณธ๊ฐ’ ์„ค์ •)
def my_function(a, b=2, c=3):
    #Do this with a
    #Then do this with b
    #Finally do this with c


# ํ•จ์ˆ˜ ํ˜ธ์ถœ (๊ธฐ๋ณธ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š์€ ์ธ์ˆ˜ a์— ๋“ค์–ด๊ฐˆ ๊ฐ’๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ž๋™ ์ ์šฉ)
my_function(3)

# ์œ„์น˜ ์ธ์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœ (์ˆœ์„œ๋Œ€๋กœ a์— 2, b์— 4๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  c๋Š” ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ)
my_function(2, 4)

# ์ž…๋ ฅ๊ฐ’ ์ˆ˜์ •ํ•˜์—ฌ ํ˜ธ์ถœ (์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์€ ๊ฐ’ ์ž…๋ ฅ)
my_function(b=5)

โ—‡ *args : ์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ๊ฐ–๋Š” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

* + args

  • ๊ฐ€๋ณ€ ์œ„์น˜ ์ธ์ˆ˜(unlimited positional arguments)
  • ํ•ด๋‹น ํ•จ์ˆ˜์— ์›ํ•˜๋Š” ๋งŒํผ์˜ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • args๋Š” arguments์˜ ์ค„์ž„๋ง
    (๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ด€์Šต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ, ์›ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๋จ)
  • args์˜ ํƒ€์ž…์€ ํŠœํ”Œ
    • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋์„ ๋•Œ ์ „๋‹ฌ๋๋˜ ๋ชจ๋“  ์ž…๋ ฅ๋“ค์„ ๋‚˜ํƒ€๋ƒ„
    • ์• ์Šคํ„ฐ๋ฆฌ์Šคํฌ๋กœ ํŠœํ”Œ์˜ ๋ชจ๋“  ์ธ์ˆ˜๋“ค์„ ์ˆ˜์ง‘
    • ํŠœํ”Œ์„ for๋ฌธ์œผ๋กœ ๋ฐ˜๋ณต ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ(์œ„์น˜๋กœ ์ธ์ˆ˜ ์ฐธ์กฐ)
# ์ˆซ์ž 2๊ฐœ๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
def add_2(n1, n2):
    return n1 + n2

# ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ชจ๋“  ์ˆซ์ž๋“ค์„ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
def add_all(*args):
    sum = 0
    for n in args:
        sum += n
    return sum


print(add_all(1, 2, 3, 4, 5))
print(add_all(55, 31, 78, 39, 325, 229, 16, 80))
15
853

โ—‡ **kwargs : ์ž„์˜์˜ ์ˆซ์ž ํ‚ค์›Œ๋“œ ์ธ์ˆ˜ ๋‹ค๋ฃจ๊ธฐ

** + kwargs

  • ๊ฐ€๋ณ€ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜
  • kwargs๋Š” keyword arguments์˜ ์ค„์ž„๋ง
  • ํ‚ค=๊ฐ’ ํ˜•ํƒœ๋กœ ๋œ ์ธ์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด kwargs์— ์ €์žฅ๋จ
  • kwargs์˜ ํƒ€์ž…์€ ๋”•์…”๋„ˆ๋ฆฌ
    • ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๋Š” ํ‚ค๊ฐ€ ๋˜๊ณ , ์ž…๋ ฅํ•œ ๊ฐ’์ด ํ‚ค์˜ ๊ฐ’์ด ๋จ
    • ์ด์ค‘ ์• ์Šคํ„ฐ๋ฆฌ์Šคํฌ๋กœ ์ž„์˜์˜ ์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ‚ค์›Œ๋“œ ์ธ์ˆ˜๊ฐ€ ์ž‘๋™๋จ
def calculate(n, **kwargs):
    # for๋ฌธ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ ์ˆœํšŒ
    for key, value in kwargs.items():
        print(f"{key}, {value}")
    # ํ‚ค ์ด๋ฆ„์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ’์— ์ ‘๊ทผ
    n += kwargs["add"]
    n *= kwargs["mul"]
    print(n)


calculate(2, add=3, mul=5)
add, 3
mul, 5
25
class Car:
    def __init__(self, **kwargs):
        self.make = kwargs["make"]        # ๋Œ€๊ด„ํ˜ธ๋กœ ๊ฐ’ ๊ตฌํ•˜๊ธฐ (๋”•์…”๋„ˆ๋ฆฌ์— ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ)
        self.model = kwargs.get("model")  # get()ํ•จ์ˆ˜๋กœ ๊ฐ’ ๊ตฌํ•˜๊ธฐ (๋”•์…”๋„ˆ๋ฆฌ์— ํ‚ค๊ฐ€ ์—†์œผ๋ฉด None ๋ฐ˜ํ™˜)


my_car = Car(make='nissan')
print(my_car.make)
print(my_car.model)
nissan
None
from tkinter import *
window = Tk()

window.title("My First GUI Program")
window.minsize(width=500, height=300)

my_label = Label(text="I Am a Label", font=('Arial', 24, 'bold'))
my_label.pack()

# my_label์— ์„ค์ •ํ•œ ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ
my_label['text'] = "New Text"           # ๋ฐฉ๋ฒ• 1
my_label.config(text='New Text 2')      # ๋ฐฉ๋ฒ• 2


window.mainloop()

๐Ÿชถ Tkinter ์œ„์ ฏ ์„ค์ • ๋ฐ”๊พธ๊ธฐ

๋ ˆ์ด๋ธ”, ๋ฒ„ํŠผ, ์—”ํŠธ๋ฆฌ ๋“ฑ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋กœ ์œ„์ ฏ ์„ค์ • ๋ณ€๊ฒฝํ•˜๊ธฐ (Tk Commands)

from tkinter import *
window = Tk()

window.title("My First GUI Program")
window.minsize(width=500, height=300)

# ๋ ˆ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ (ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ํ…์ŠคํŠธ)
my_label = Label(text="I Am a Label", font=('Arial', 24, 'bold'))
my_label.pack()

# ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ (ํด๋ฆญ ๊ฐ€๋Šฅ)
def button_click():                 # ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
    new_text = input.get()          # get() ํ•จ์ˆ˜๋กœ ์—”ํŠธ๋ฆฌ์— ์ž…๋ ฅํ•œ ๊ฒƒ์„ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
    my_label.config(text=new_text)

button = Button(text="click me", command=button_click)
button.pack()

# ์—”ํŠธ๋ฆฌ ์ปดํฌ๋„ŒํŠธ (ํ…์ŠคํŠธ ์ž…๋ ฅ ๊ฐ€๋Šฅ)
input = Entry(width=10)
input.pack()


window.mainloop()
์—”ํŠธ๋ฆฌ์— ๋ฌธ์ž์—ด ์ž…๋ ฅ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ ˆ์ด๋ธ”์˜ ๋ฌธ์ž์—ด์„ ์—”ํŠธ๋ฆฌ์— ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝ

๐Ÿชถ ๋‹ค์–‘ํ•œ ์œ„์ ฏ

  • END : Tkinter๊ฐ€ ํŠน์ • ํ•ญ๋ชฉ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ธ๋ฑ์Šค
from tkinter import *

#Creating a new window and configurations
window = Tk()
window.title("Widget Examples")
window.minsize(width=500, height=500)

#Labels
label = Label(text="This is old text")
label.config(text="This is new text")
label.pack()

#Buttons
def action():
    print("Do something")

#calls action() when pressed
button = Button(text="Click Me", command=action)
button.pack()

#Entries
entry = Entry(width=30)
#Add some text to begin with(์‹œ์ž‘ ํ…์ŠคํŠธ ๋„ฃ๊ธฐ)
entry.insert(END, string="Some text to begin with.")
#Gets text in entry
print(entry.get())
entry.pack()

#Text
text = Text(height=5, width=30)
#Puts cursor in textbox.
text.focus()
#Adds some text to begin with.
text.insert(END, "Example of multi-line text entry.")
#Get's current value in textbox at line 1, character 0
print(text.get("1.0", END))
text.pack()

#Spinbox
def spinbox_used():
    #gets the current value in spinbox.
    print(spinbox.get())
spinbox = Spinbox(from_=0, to=10, width=5, command=spinbox_used)
spinbox.pack()

#Scale
#Called with current scale value.
def scale_used(value):
    print(value)
scale = Scale(from_=0, to=100, command=scale_used)
scale.pack()

#Checkbutton
def checkbutton_used():
    #Prints 1 if On button checked, otherwise 0.
    print(checked_state.get())
#variable to hold on to checked state, 0 is off, 1 is on.
checked_state = IntVar()
checkbutton = Checkbutton(text="Is On?", variable=checked_state, command=checkbutton_used)
checked_state.get()
checkbutton.pack()

#Radiobutton
def radio_used():
    print(radio_state.get())
#Variable to hold on to which radio button value is checked.
radio_state = IntVar()
radiobutton1 = Radiobutton(text="Option1", value=1, variable=radio_state, command=radio_used)
radiobutton2 = Radiobutton(text="Option2", value=2, variable=radio_state, command=radio_used)
radiobutton1.pack()
radiobutton2.pack()

#Listbox
def listbox_used(event):
    # Gets current selection from listbox
    print(listbox.get(listbox.curselection()))

listbox = Listbox(height=4)
fruits = ["Apple", "Pear", "Orange", "Banana"]
for item in fruits:
    listbox.insert(fruits.index(item), item)
listbox.bind("<<ListboxSelect>>", listbox_used)
listbox.pack()


window.mainloop()

๐Ÿชถ Tkinter ๋ ˆ์ด์•„์›ƒ ๋งค๋‹ˆ์ €

GUI ํ”„๋กœ๊ทธ๋žจ์˜ ์œ„์ ฏ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๊ด€๋ฆฌ์ž๋กœ, ์œ„์ ฏ์„ ๋งŒ๋“  ํ›„ ๊ผญ ๋ช…์‹œํ•ด์•ผ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚จ

  • Pack
    • ๊ฐ ์œ„์ ฏ์„ ๋…ผ๋ฆฌ์ ์ธ ํ˜•ํƒœ๋กœ ๋‹ค์Œ ์œ„์ ฏ ์˜†์— ๋ฐฐ์น˜ํ•˜๋Š” ์—ญํ• 
    • ๋””ํดํŠธ ๊ฐ’
      • ํ•ญ์ƒ ์œ„์—์„œ๋ถ€ํ„ฐ ๋ฐฐ์น˜
      • ๋‹ค๋ฅธ ์œ„์ ฏ์€ ์ด์ „ ๊ฒƒ์˜ ๋ฐ”๋กœ ์•„๋ž˜
    • ์œ„์น˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋ช…์‹œํ•˜๊ธฐ ์–ด๋ ค์›€
  • Place
    • x,yx, y ๊ฐ’์œผ๋กœ ์ •ํ™•ํ•œ ์œ„์น˜ ์„ ์ •
    • ๋งค๋ฒˆ ์ •ํ™•ํ•œ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ๋‹จ์ 
  • Grid
    • ์ „์ฒด ํ™”๋ฉด์„ ๊ฒฉ์ž๋ฌด๋ŠฌํŒ์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ํ–‰๊ณผ ์—ด๋กœ ๋‚˜๋ˆ„์–ด ์œ„์น˜ ์ง€์ •
    • ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค๊ณผ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ
      • ํ–‰๊ณผ ์—ด์˜ ๋ฒˆํ˜ธ๋ฅผ ๋’ค์ชฝ์œผ๋กœ ๋ฐ”๊ฟ”๋„ ๊ทธ ์•ž์— ๋‹ค๋ฅธ ์œ„์ ฏ ์—†์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์Œ
      • ์™ผ์ชฝ ์œ—๋ถ€๋ถ„(column=0, row=0)์„ ์‹œ์ž‘์œผ๋กœ ์›ํ•˜๋Š” ์œ„์ ฏ์„ ์ฐจ๋ก€๋กœ ๋ฐฐ์น˜

โ—๏ธPack๊ณผ Grid๋Š” ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์„ž์–ด ์“ธ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒ

from tkinter import *
window = Tk()

# ๋ ˆ์ด๋ธ”
my_label = Label(text="Label")
my_label.grid(column=0, row=0)

# ๋ฒ„ํŠผ1
button = Button(text="Button1")
button.grid(column=1, row=1)

# ๋ฒ„ํŠผ2
new_button = Button(text="Button2")
new_button.grid(column=2, row=0)

# ์—”ํŠธ๋ฆฌ
input = Entry(width=10)
input.grid(column=3, row=2)


window.mainloop()

grid ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์ ฏ๋“ค์„ ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜

๐Ÿชถ ์ปดํฌ๋„ŒํŠธ์— ํŒจ๋”ฉ ์ถ”๊ฐ€ํ•˜๊ธฐ

padding : ์œ„์ ฏ ์ฃผ์œ„์— ์—ฌ๋ฐฑ์„ ์—ฌ์œ  ๊ณต๊ฐ„์œผ๋กœ ์ถ”๊ฐ€

from tkinter import *
window = Tk()

# ์œˆ๋„์šฐ ๊ฐ€์žฅ์ž๋ฆฌ์— ํŒจ๋”ฉ ์ถ”๊ฐ€
window.config(padx=100, pady=50)

my_label = Label(text="Label")
my_label.grid(column=0, row=0)
# ๋ ˆ์ด๋ธ”์— ํŒจ๋”ฉ ์ถ”๊ฐ€
my_label.config(padx=50, pady=50)

button = Button(text="Button1")
button.grid(column=1, row=1)
# ๋ฒ„ํŠผ1์— ํŒจ๋”ฉ ์ถ”๊ฐ€
button.config(padx=30, pady=20)

new_button = Button(text="Button2")
new_button.grid(column=2, row=0)
# ๋ฒ„ํŠผ2์— ํŒจ๋”ฉ ์ถ”๊ฐ€
new_button.config(padx=10, pady=5)


input = Entry(width=10)
input.grid(column=3, row=2)


window.mainloop()

๐Ÿ—‚๏ธ Day27 ํ”„๋กœ์ ํŠธ : Miles to Km ๋ณ€ํ™˜ GUI ํ”„๋กœ๊ทธ๋žจ

๊ฑฐ๋ฆฌ๋ฅผ mile๋กœ ์ž…๋ ฅํ•˜๋ฉด km๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ

๐Ÿ” ์œ ์˜ ์‚ฌํ•ญ

  • ๋ณ€ํ™˜ ๊ณต์‹ : 1mile=1.609km1mile = 1.609km
  • grid ๋ ˆ์ด์•„์›ƒ
    • 0ํ–‰ 1์—ด : mile๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” ์—”ํŠธ๋ฆฌ
    • 0ํ–‰ 2์—ด : Miles ๋ ˆ์ด๋ธ”
    • 1ํ–‰ 0์—ด : is equal to ๋ ˆ์ด๋ธ”
    • 1ํ–‰ 1์—ด : ๋ณ€ํ™˜๋œ km๊ฐ’์ด ๋ณด์—ฌ์ง€๋Š” ๋ ˆ์ด๋ธ”(0์œผ๋กœ ์‹œ์ž‘)
    • 1ํ–‰ 2์—ด : Km ๋ ˆ์ด๋ธ”
    • 2ํ–‰ 1์—ด : ๊ณ„์‚ฐ ๋ฒ„ํŠผ

โŒจ๏ธ main.py

from tkinter import *

def miles_to_km():
    miles = float(miles_input.get())
    km = round(miles * 1.609, 2)
    km_result_label.config(text=f"{km}")

window = Tk()
window.title("Miles to Km Converter")
window.config(padx=20, pady=20)

miles_input = Entry(width=9)
miles_input.insert(END, string="0")
miles_input.grid(column=1, row=0)

miles_label = Label(text='Miles')
miles_label.grid(column=2, row=0)

is_equal_label = Label(text='is equal to')
is_equal_label.grid(column=0, row=1)

km_result_label = Label(text=0)
km_result_label.grid(column=1, row=1)

km_label = Label(text='Km')
km_label.grid(column=2, row=1)

calculate_button = Button(text='Calculate', command=miles_to_km)
calculate_button.grid(column=1, row=2)


window.mainloop()




โ–ท Angela Yu, [Python ๋ถ€ํŠธ์บ ํ”„ : 100๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋กœ Python ๊ฐœ๋ฐœ ์™„์ „ ์ •๋ณต], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0๊ฐœ์˜ ๋Œ“๊ธ€