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 씩 자동으로 증가하지 마십시오. 대신 각 호출 사이의 시간을 계산하고 델타를 추가하십시오.
타이머가 시작된 시간을 기록하고 디스플레이가 업데이트 될 때마다 현재 시간과 녹화 된 시간의 차이를 표시하십시오. 정확한 업데이트 빈도는 무의미합니다. – jasonharper