저는 Python을 처음 사용하고 일반적으로 프로그래밍합니다. 데킬라 타이머 인 타이머에 카운트 다운 디스플레이를 만드는 데 도움이 필요합니다. 내 친구들은 테킬라를 많이 마시고 컴퓨터에 대해 전혀 몰라 타이머를 만들어달라고 부탁했습니다.
어쨌든, 저는 레이아웃을 제가 할 수있는 최선의 방법으로 만들었고 다음과 같이 보입니다 : https://i.stack.imgur.com/bvt57.png
도움이 필요한 것은 1 분 버튼을 클릭하면 1 분에서 0으로 카운트 다운된다는 것입니다. 다른 버튼도 마찬가지입니다. 중지 작업에 대한 도움이 필요하므로 언제든지 중지 버튼을 눌러 타이머를 중지 할 수 있습니다. 정말 큰 도움이 될 것입니다 !!
내 코드는 다음과 같습니다.
import tkinter as tk
#GUI
root = tk.Tk()
root.title("Tequila timer")
#Load of background with the tequila bottle
canvas = tk.Canvas(root, width=423, height=700)
canvas.pack()
Load = tk.PhotoImage(file="tequila.png")
canvas.create_image(211, 350, image=Load)
#buttons
btn_1min = tk.Button(root, text="1 min", width=10, height=5, command=root.quit)
btn_1min_v = canvas.create_window(140, 350, window=btn_1min)
btn_10min = tk.Button(root, text="10 min", width=10, height=5, command=root.quit)
bt1_10min_v = canvas.create_window(283, 350, window=btn_10min)
btn_1hour = tk.Button(root, text="1 hour", width=10, height=5, command=root.quit)
bt1_1hour_v = canvas.create_window(140, 475, window=btn_1hour)
btn_2hours = tk.Button(root, text="2 hours", width=10, height=5, command=root.quit)
bt1_2hours_v = canvas.create_window(283, 475, window=btn_2hours)
btn_stop = tk.Button(root, text="Stop", width=10, height=5, command=root.quit)
bt1_stop_v = canvas.create_window(211, 600, window=btn_stop)
#Display
label = tk.Label(root, text="00:00:00", width=9, font=("calibri", 40, "bold"))
label.pack()
label_v = canvas.create_window(211, 200, window=label)
root.mainloop()
문제는 버튼이 아무것도 매핑되지 않는다는 것입니다. 글쎄, root.quit
당신의 창문을 닫는 것 외에는 .
첫 번째 문제부터 시작하겠습니다. 에서 텍스트를 업데이트해야합니다 Label
. 이를 수행하는 좋은 방법은 tkinter
s StringVar
클래스입니다. 를 업데이트 StringVar
하면 텍스트도 업데이트 Label
되므로 먼저 수행해 보겠습니다.
countdown = tk.StringVar()
countdown.set("00:00:00")
그런 다음 Label
.
label = tk.Label(root, textvariable=countdown, width=9, font=("calibri", 40, "bold"))
이제 처리되었습니다. 두 번째 문제로 넘어가겠습니다. 콜백 기능이 부족합니다. 먼저 카운트 다운 할 가변 시간 (초)을받는 함수를 호출하도록 설정하겠습니다.
root.mainloop()
호출 된 후에 무언가를 표시하려면 after()
메서드를 사용할 수 있습니다 . 나중에 업데이트를 취소하는 데 사용할 수있는 식별자를 반환합니다. 그러나 나중에 다른 함수에서 사용하여 취소하려면 키워드를 사용하여 전역 변수로 만들어야합니다 global
.
는 root.after
그 (밀리 초)이 경과 한 후에 호출에 밀리 세컨드의 인수 및 기능을합니다. 이 함수를 호출 할 때보 다 1 밀리 초 더 적게이 함수를 다시 호출 해 보겠습니다. 또한 초가 0 미만으로 떨어지면 콜백을 취소해야합니다.
이전에 검색 root.after_cancel
한 after
식별자를 사용 하여이를 수행 할 수 있습니다 root.after
.
주목해야 할 또 다른 점은 root.after
함수 인수가 함수 객체를 기대한다는 것입니다. 인수가있는 함수를 전달하려면 람다로 래핑 할 수 있습니다.
def update(seconds):
global after
if seconds >= 0:
countdown.set(seconds_to_time(seconds))
after = root.after(1000, lambda: update(seconds - 1))
else:
root.after_cancel(after)
하지만이 seconds_to_time
기능은 무엇 으로 설정 StringVar
되어 있습니까? 글쎄, 우리의 초를 적절한 hh:mm:ss
형식으로 표시하는 것은 약간의 도우미 입니다.
def seconds_to_time(seconds):
hours = seconds // 3600
seconds -= hours * 3600
minutes = seconds // 60
seconds -= minutes * 60
return f'{hours:02d}:{minutes:02d}:{seconds:02d}'
마지막 요청은 카운트 다운을 중지하는 것입니다. 글로벌 이후 식별자를 취소하면됩니다. NameError
아직 설정되지 않은 경우 오류를 방지하여 먼저 애프터를 설정했는지 확인하는 것이 좋습니다 .
def stop():
try:
root.after_cancel(after)
except NameError:
pass
아래 전체 코드 : 버튼의 콜백 함수가 람다로 래핑되어 콜백에 인수를 전달할 수 있습니다.
import tkinter as tk
def update(seconds):
global after
if seconds >= 0:
countdown.set(seconds_to_time(seconds))
after = root.after(1000, lambda: update(seconds - 1))
else:
root.after_cancel(after)
def seconds_to_time(seconds):
hours = seconds // 3600
seconds -= hours * 3600
minutes = seconds // 60
seconds -= minutes * 60
return f'{hours:02d}:{minutes:02d}:{seconds:02d}'
def stop():
try:
root.after_cancel(after)
except NameError:
pass
#GUI
root = tk.Tk()
root.title("Tequila timer")
#Load of background with the tequila bottle
canvas = tk.Canvas(root, width=423, height=700)
canvas.pack()
Load = tk.PhotoImage(file="tequila.png")
canvas.create_image(211, 350, image=Load)
countdown = tk.StringVar()
countdown.set("00:00:00")
#buttons
btn_1min = tk.Button(root, text="1 min", width=10, height=5, command=lambda: update(60))
btn_1min_v = canvas.create_window(140, 350, window=btn_1min)
btn_10min = tk.Button(root, text="10 min", width=10, height=5, command=lambda: update(600))
bt1_10min_v = canvas.create_window(283, 350, window=btn_10min)
btn_1hour = tk.Button(root, text="1 hour", width=10, height=5, command=lambda: update(3600))
bt1_1hour_v = canvas.create_window(140, 475, window=btn_1hour)
btn_2hours = tk.Button(root, text="2 hours", width=10, height=5, command=lambda: update(7200))
bt1_2hours_v = canvas.create_window(283, 475, window=btn_2hours)
btn_stop = tk.Button(root, text="Stop", width=10, height=5, command=stop)
bt1_stop_v = canvas.create_window(211, 600, window=btn_stop)
#Display
label = tk.Label(root, textvariable=countdown, width=9, font=("calibri", 40, "bold"))
label.pack()
label_v = canvas.create_window(211, 200, window=label)
root.mainloop()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다