2012-02-24 3 views
-2

항에 광고를 인쇄 "라인"파일의 라인을 포함하는 배열이다는 I이 부호화 소인

def show_line(self): 
    next_line = self.curr_line + 1 
    self.line = self.lines[self.curr_line] 
    y = self.line.split(' ') 
    z = self.lines[next_line].split(' ') 
    d1 = datetime.datetime.fromtimestamp(float(y[0])) 
    d2 = datetime.datetime.fromtimestamp(float(z[0])) 
    d3 = d2-d1 
    d3s = str(d3) 
    sleep_time = int(float(d3s[6::]))*1000 
    print_on_screen(self.line) 
    glib.timeout_add(sleep_time, self.show_line) 
    self.curr_line += 1 
    return False 

은 (I는 readlines도 사용()). 이 두 줄의 각각에는 화면에 문자열 을 표시하는 데 사용되는 타임 스탬프가 두 개 (d3)의 차이에 따라 표시됩니다.

문제는 첫 번째 줄, 3 번째 줄, 5 번째 줄 등이 에 표시되고 타임 스탬프를 따르지 않는 것입니다. 제안 사항?

프랑코

+1

실제로 위의 사항이 잘못되었습니다. 당신이하려고하는 것이 아니라 무엇이 잘못되었는지를 알려주는 것. –

+0

glib.timeout_add에 대해 궁금합니다. 왜 이걸 쓰고 있니? 한 가지 문제는 제한 시간이 끝나면 self.showline 함수를 호출하므로 "self.curr_line + = 1"이 실행되지 않는다는 것입니다 ... – Tom97531

+0

@ Tom97531이 잘못되었습니다. 'self.curr_line + = 1'과'return False' 라인은 가장 확실히 실행됩니다. 'glib.timeout_add' (혹은'gobject.timeout_add')가 호출되어서 함수의 나머지 부분이 실행되는 것을 막지 못합니다. – Celada

답변

2

당신은 밀리 초 단위의 숫자에 타임 스탬프를 변환하는 그러나 당신이 잘못을하고있다 :

d3s = str(d3) 
sleep_time = int(float(d3s[6::]))*1000 

내가 문자열로 타임 스탬프를 변환 일부를 추출하여이 일을하는 이유를 상상할 수 없다 문자를 추출한 다음이를 부동 소수점으로 변환 한 다음 이번에는 다시 정수로 변환합니다. 이 코드는 명확하지 않지만 분명히 거기에 오류가 있습니다. 왜 문자열의 처음 6자를 버리는 거지?

밀리 초에 datetime.timedelta을 변환하는 올바른 방법은 다음과 같습니다 당신은 utcfromtimestamp하지 fromtimestamp 사용해야

  • :

    sleep_time = d3.total_seconds()*1000 
    

    당신은 당신의 코드에 다른 문제가있다. 시간 소인을 현지 시간으로 변환하면 현지 시간대에 종속되어 있으므로 그 모든 함정을 수반 할 수 있습니다. 예를 들어 요일 절약 시간 경계를 넘는 두 개의 타임 스탬프 사이의 차이를 계산하는 데 문제가있을 수 있습니다. 여기서 현지 시간을 사용할 필요가 없습니다. UTC로 작업 할 수도 있습니다.

  • 사실 실제로 타임 스탬프를 datetime.datetime 개 개체로 변환 할 필요는 없습니다. 타임 스탬프를 직접 빼면 어떨까요?
  • 끝에서 두 번째 줄에 도착하면 버그가 있습니다.