2010-03-08 2 views
54

파이썬의 tkinter 라이브러리로 프로그램을 작성해야합니다.tkinter를 사용하여 타이머를 만드는 방법은 무엇입니까?

내 주요 문제는 내가 타이머 또는 hh:mm:ss 같은 시계를 만드는 방법을 모르겠입니다.

스스로 업데이트해야합니다 (어떻게 해야할지 모르겠습니다).

+2

다음 [타이머를 구현하기 위해''root.after()를 사용하는 방법에 대한 코드 예제.]의 (https://gist.github.com/zed/5440b9372a15d86b5c47) – jfs

답변

83

Tkinter 루트 창에는 after이라는 메서드가 있습니다.이 메서드는 지정된 기간 후에 함수를 호출하도록 예약하는 데 사용할 수 있습니다. 이 함수 자체가 after이라면 자동으로 반복되는 이벤트를 설정해야합니다. after 시간에 정확하게 실행 기능을 보장하지 않는다는 점을 염두에

# for python 3.x use 'tkinter' rather than 'Tkinter' 
import Tkinter as tk 
import time 

class App(): 
    def __init__(self): 
     self.root = tk.Tk() 
     self.label = tk.Label(text="") 
     self.label.pack() 
     self.update_clock() 
     self.root.mainloop() 

    def update_clock(self): 
     now = time.strftime("%H:%M:%S") 
     self.label.configure(text=now) 
     self.root.after(1000, self.update_clock) 

app=App() 

곰 : 여기

은 작업 예입니다. 은 일정한 시간이 지나면 실행할 작업을으로 예약합니다. Tkinter가 단일 스레드이므로 응용 프로그램이 사용 중이면 호출되기 전에 지연 될 수 있습니다. 지연은 일반적으로 마이크로 초 단위로 측정됩니다.

+0

이되지 않습니다 재귀 호출 자체에 "파이썬 개체에 도달 한 최대 재귀"오류가 발생합니까? –

+0

@SatwikPasani : 아니, 재귀 호출이 아니기 때문에 아니요. 단지 대기열에 작업을 넣을뿐입니다. –

7

Python3 시계 예제는 최상위 응용 프로그램이 아닌 frame.after()를 사용합니다. 또한 난 그냥 MVP 패턴을 사용하여 간단한 타이머를 생성

#!/usr/bin/env python3 

# Display UTC. 
# started with https://docs.python.org/3.4/library/tkinter.html#module-tkinter 

import tkinter as tk 
import time 

def current_iso8601(): 
    """Get current date and time in ISO8601""" 
    # https://en.wikipedia.org/wiki/ISO_8601 
    # https://xkcd.com/1179/ 
    return time.strftime("%Y%m%dT%H%M%SZ", time.gmtime()) 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.pack() 
     self.createWidgets() 

    def createWidgets(self): 
     self.now = tk.StringVar() 
     self.time = tk.Label(self, font=('Helvetica', 24)) 
     self.time.pack(side="top") 
     self.time["textvariable"] = self.now 

     self.QUIT = tk.Button(self, text="QUIT", fg="red", 
              command=root.destroy) 
     self.QUIT.pack(side="bottom") 

     # initial time display 
     self.onUpdate() 

    def onUpdate(self): 
     # update displayed time 
     self.now.set(current_iso8601()) 
     # schedule timer to call myself after 1 second 
     self.after(1000, self.onUpdate) 

root = tk.Tk() 
app = Application(master=root) 
root.mainloop() 
+0

좋은 대답입니다. 표시된 시간은 실제로 시스템 시간이며 누적 된 오류 시간이 아닙니다 ("약 1000ms"를 60 번 기다리면 60 초가 아닌 "약 1 분"이 걸립니다. 오류는 시간이 지남에 따라 커집니다. 그러나 시계는 몇 초 만에 건너 뛸 수 있습니다. 1 초 미만의 오류가 누적 될 수 있습니다. 앞으로 2 초 건너 뛰십시오. 나는'self.after (1000 - int (1000 * (time.time() - int (time.time()))) 또는 1000, self.onUpdate)'를 제안 할 것이다. 아마도'time.time()'을이 표현식보다 먼저 변수에 저장하는 편이 낫습니다. –

+1

나는 내 의견에 xkcd를 포함시킬 정도로 굉장한 것을 열망한다. – bitsmack

1

StringVar()와 라벨을 업데이트 보여줍니다 (그러나 그것은 그렇게 간단한 프로젝트에 대한 과잉 될 수있다). 종료, 시작/일시 중지 및 중지 버튼이 있습니다. 시간은 HH : MM : SS 형식으로 표시됩니다. 시간 계산은 초 단위로 여러 번 실행되는 스레드와 타이머가 시작된 시간과 현재 시간의 차이를 사용하여 구현됩니다.

Source code on github

1
from tkinter import * 
import time 
tk=Tk() 
def clock(): 
    t=time.strftime('%I:%M:%S',time.localtime()) 
    if t!='': 
     label1.config(text=t,font='times 25') 
    tk.after(100,clock) 
label1=Label(tk,justify='center') 
label1.pack() 
clock() 
tk.mainloop() 
+1

설명을 추가 할 수 있다면 도움이 될 것이다. 복사/붙여 넣기 코드는 거의 유용하지 않습니다 ;-) – Carpetsmoker

+0

이 코드는 지역의 정확한 시간을 제공합니다. 또한 타이머 역할을합니다. –

관련 문제