AttributeError: у объекта 'timedelta' нет атрибута 'strptime' в Form1, строка 38 - PullRequest
0 голосов
/ 18 июня 2019

Попытка изменить приложение таймера, сделанное из наковальни, для отображения ЧЧ: ММ: СС вместо нескольких секунд

"self.label_time_elapsed.text =" {} ". Format ( (datetime.now () - self.start_time) .strftime ('% H:% M:% S')) ) "- попробовал это из другого вопроса, который я задал, теперь у меня другая ошибка

from anvil import *
import anvil.server
import anvil.tables as tables
import anvil.tables.query as q
from anvil.tables import app_tables
from datetime import datetime


class Form1(Form1Template):

  def __init__(self, **properties):
    # Set Form properties and Data Bindings.
    self.init_components(**properties)

    # Any code you write here will run when the form opens.
    self.start_time = None

  def button_start_click(self, **event_args):
    """This method is called when the button is clicked"""
    self.start_time = datetime.now()
    self.button_start.visible = False
    self.button_stop.visible = True

  def button_stop_click(self, **event_args):
    """This method is called when the button is clicked"""
    self.stop_time = datetime.now()
    self.total_time = self.stop_time - self.start_time
    anvil.server.call('add_session', self.start_time, 
 self.total_time.seconds)

    self.start_time = None
    self.button_start.visible = True
    self.button_stop.visible = False

  def timer_progress_tick(self, **event_args):
     """This method is called Every [interval] seconds. Does not trigger
     if [interval] is 0."""
    if self.start_time is not None:
     self.label_time_elapsed.text = "{}".format(
         (datetime.now() - self.start_time).strptime('%H:%M:%S'))

AttributeError: у объекта 'timedelta' нет атрибута 'strptime' в Form1, строка 38

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Вы можете попробовать использовать пользовательскую функцию.

Пример:

import datetime

def cust(seconds):
    m, s = divmod(seconds, 60)
    h, m = divmod(m, 60)
    return "{hour}:{min}:{sec}".format(hour=int(h), min=int(m), sec=int(s))    

now = datetime.datetime.now()
d = (now - datetime.datetime.strptime("2016-01-01", "%Y-%m-%d")).total_seconds()
print(cust(d))

Выход:

30349:52:12

В вашем случае

cust(datetime.now() - self.start_time).total_seconds())
0 голосов
/ 18 июня 2019

timedelta объекты содержат дельту между двумя датами - 2 года, 2 миллисекунды и т. Д.

Вы пытаетесь привести эту временную дельту в строковое представление даты / времени; мгновение, которое невозможно.

now - self.start_time - это не дата или время, это промежуток времени, прошедший между тогда и сейчас. Выразите это, скажем, вместо секунд:

(datetime.now() - self.start_time).total_seconds()

edit: преобразовать эти секунды в HH:MM:SS:

td = datetime.now() - self.start_time
minutes, seconds = divmod(td.seconds + td.days * 86400, 60)
hours, minutes = divmod(minutes, 60)
self.label_time_elapsed.text = '{:d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
...