파이썬/파이썬(python) 중급

[28-4 파이썬] tkinter 타이머 만들기 fg, math.floor, itemconfig(), after(), 재귀호출, command

Olivia-BlackCherry 2022. 9. 17. 16:11

fg

fg 파라미터 

글씨의 색깔을 바꿔준다.

 

grid

grid로 컴포넌트를 배치한다.

GREEN = "#9bdeac"
YELLOW = "#f7f5dd"
PINK = "#EBC7E8"

from tkinter import *

window = Tk()
window.title("dog_time")
window.config(padx=100, pady=50, bg=YELLOW)

canvas = Canvas(width=400, height=300, bg=PINK, highlightthickness=0)
dog_img = PhotoImage(file="dog.png")
canvas.create_image(200, 140, image=dog_img)
canvas.create_text(190,30, text="00:00", fill = "purple", font =("Courier", 40, "bold"))
canvas.grid(row=1, column=1)

label_time = Label(text="Timer", font= ("Courier", 50, "bold"), fg=GREEN, bg= YELLOW)
label_time.grid(row=0, column=1)

button_start = Button(text="Start", font= ("Courier", 20, "bold"), fg="black", bg=YELLOW, highlightthickness=0)
button_start.grid(row=2, column=0)

button_reset = Button(text="Reset", font=("Courier", 20, "bold"), fg="black", bg=YELLOW, highlightthickness=0)
button_reset.grid(row=2, column=2)

check = Label(text="V", fg=GREEN, bg=YELLOW)
check.grid(row=3, column=1)

window.mainloop()

 

 

after()

after(ms=?, fun=?, arg*)

ms : 1초 =1000ms

fun : ms 뒤에 해야할 일

arg* : 무제한 위치 인자이다.

def say_something(thing, a, b):
    print(thing)
    print(a)
    print(b)
window.after(1000, say_something,"NO", 1 , 2)

 

 

재귀호출

재귀호출로 반복문 만들기

def count_down(number):
    print(number)
    if number>0:
        window.after(1000, count_down, number-1)
count_down(5)

count_down(5) ->window.after(1000, count_down, 4)
count_down(4)-> window.after(1000, count_down, 3)
count_down(3)-> window.after(1000, count_down, 2)
count_down(2)-> window.after(1000, count_down, 1)
count_down(1)-> window.after(1000, count_down, 0)

 

 

 

카운트 다운 출력

00:00 자리에서 카운트 다운하게 만들기

time_text =canvas.create_text(190,30, text="00:00", fill = "purple", font =("Courier", 40, "bold"))

먼저 캔버스에 쓰여진 00:00을 time_text라는 변수에 저장한다.

 

 

itemconfig()

canvas.itemconfig() 

캔버스에 텍스트를 바꾸어준다. 

무엇을, 어떻게 파라미터가 차례로 온다.

def count_down(number):
    canvas.itemconfig(time_text, text=number)
    if number>0:
        window.after(1000, count_down, number-1)

 

 

command

start 버튼을 누르면 타이머가 작동하도록 한다.

먼저 start_timer() 함수를 만들어 호출 시 count_down이 작동하게 하고

def start_timer():
    count_down(5)

버튼 컴포넌트에 command로 start_timer를 넣는다.

button_start = Button(text="Start", font= ("Courier", 20, "bold"), fg="black", bg=YELLOW, highlightthickness=0, command=start_timer)

 

 

math.floor()

math 모듈의 floor 함수로 버림 구현하기

import math
number =math.floor(6.3435)
print(number)

6

 

 

 

분:초 형식으로 타이머 카운트 바꾸기

타이머 출력형식 바꾸기

분:초로 나오게 만들기

def count_down(number):
    minute = math.floor(number/60)
    second = number % 60
    canvas.itemconfig(time_text, text=f"{minute}:{second}")
    if number>0:
        window.after(1000, count_down, number-1)

 

 

동적타이핑 특성 이용하기

60, 50, 34, 10, 09, 01, 00 이런 식으로

초 단위가 두 자리까지 나오게 만들어보자.

 

파이선은 다른 유형의 값을 지정하면 아주 간단하게

다른 데이터타입을 가질 수 있다.

즉 동적타이핑의 특성을 이용하면 된다.

(동적타이핑에 대해 더 알고 싶다면 ----->클릭)

 

첫 번째 방법은 str()로 데이터타입을 바꿔준 뒤, 문자열 연산(+)을 이용한다.

minute = math.floor(number/60)
second = number % 60
if second ==0 or second<10:
    second="0" + str(second)

 

두 번째 방법은 f스트링을 이용하여 모든 변수를 문자형으로 바꿔준다.

minute = math.floor(number/60)
second = number % 60
if second ==0 or second<10:
    second=ㄹf"0{second}"