2017-05-09 3 views
0

Tkinter에서 정밀도 1/100 초를 가진 타이머를 파이썬과 함께 표시해야하는 툴을 프로그래밍하고 있습니다. 나는 self.timerLabel.after(0, self.update_timer)after() 메소드 실행 시간 Tkinter가

def update_timer (self): 
     self.timer += 0.01 
     self.timerLabel.configure(text="%.2f" % self.timer) 
     self.timerLabel.after(10, self.update_timer) 

의 문제를 after() 방법을 사용하여 시도가 예상보다 훨씬 느리게 실행하는 것이 내가 해결 또는 시간에 정확하게 타이머 실행을 할 수있는 방법이 있는지 알아야했습니다. 또는 컴퓨터의 시간을 사용하여 화면에 정확한 경과 시간을 표시하는 방법이있을 수 있습니다. 미리 감사드립니다.

+2

타이머가 시작된 시간을 기록하고 디스플레이가 업데이트 될 때마다 현재 시간과 녹화 된 시간의 차이를 표시하십시오. 정확한 업데이트 빈도는 무의미합니다. – jasonharper

답변

1

가장 정확한 방법은 시작 시간을 찾는 것입니다. 그러면 업데이트 타이머 함수를 호출 할 때마다 현재 시간에서 시작 시간을 뺍니다.

대략 어떻게 작동하는지 보여주기 위해 몇 가지 예제 코드를 첨부했습니다. Tkinterafter()을 사용하는 것은 매우 간단해야합니다.

import time 

# Start time 
startTime = time.time(); 

def update_timer(): 

    # Find difference and print 
    timeDifference = time.time() - startTime; 
    print(timeDifference); 

    # Sleep appropriate amount of time before printing 
    # next statement. 
    time.sleep(0.1); 

    # Recursively call update. 
    update_timer(); 

# Start running 
update_timer(); 

예 바이올린 : https://repl.it/Hoqh/0

0

after 명령은 지정된 기간 전에 실행되지 않습니다 그 이외의 보장을하지 않습니다. Tkinter는 실시간 시스템이 아닙니다.

또한 코드를 실행하는 데 걸리는 시간도 고려해야합니다. 예를 들어 명령이 제 시간에 정확하게 시작된다고 가정 해 봅시다. 그 코드가 실행 시간이 어느 정도 소요

self.timer += 0.01 
self.timerLabel.configure(text="%.2f" % self.timer) 

: 그 코드에서는 두 줄의 코드가 있습니다. 불과 몇 마이크로 초일 수도 있지만 확실히 0 마이크로 초 이상입니다.

당신은 다시 after 전화 :

self.timerLabel.after(10, self.update_timer) 

그것을 호출 한 후 몇 마이크로 초 또는 밀리 초입니다 현재 시간, 후 최소 10 밀리 될 것입니다 실행 다음 번에. 첫 번째 두 명령에 1ms가 걸리면 다음에 전화를 걸면 첫 번째 호출 후 11ms가됩니다 (지연 시간은 10ms, 코드 실행은 1ms).

지연 계수를 최소화 할 수 있습니다. 코드 나머지 부분이 실행되기를 기다리는 대신 즉시 after을 호출하여 조금만 수행하십시오. 방지 할 수있는 다른 일이 있기 때문에이 여전히 정확하지 않습니다

def update_timer (self): 
    self.timerLabel.after(10, self.update_timer) 
    self.timer += 0.01 
    self.timerLabel.configure(text="%.2f" % self.timer) 

:만큼 지연이가 다른 코드를 실행하는 데 걸리는 시간보다 큰, 당신은 약간의 개선을 알 수 있습니다 self.timer가 요청 된 후 정확하게 10ms 후에 호출되는 것을 막습니다. 예를 들어, 창 크기를 조정하거나 9.99ms로 이동하면 예약 된 작업을 처리하기 전에 tkinter가 다시 그리기를 처리해야합니다.

이 드리프트를 모두 고려하려면 매번 10ms 씩 자동으로 증가하지 마십시오. 대신 각 호출 사이의 시간을 계산하고 델타를 추가하십시오.