2017-02-10 125 views
2

我正在使用Python 2.7并希望使用日期时间函数来计算用户定义的时间来运行小型泵。我知道我错过了一些显而易见的东西,但我一直在寻找,直到我看不清楚。我有一个textCtrl,用户将输入他希望泵运行的分钟数。然后点击一个按钮将启动调度和检查,看看是否是时候关闭水泵:如何使用日期时间来计算持续时间和停止时间?

def timedPump(val): 
    now = datetime.datetime.now() 
    timeOff = now + datetime.timedelta(minutes=int(val)) 
    if timeOff > now: 
     print 'pumpOn' 
    else: 
     print 'pumpOff' 
    return True 

的问题是,每次datetime.datetime.now()更新。我该怎么做才能使now =按钮被点击的时间?

+1

你需要把你的前两行代码放在另一个函数中(例如“startTimer”),然后返回'timeOff',并调用你的函数textCtrl。然后你可以使用timedPump来​​检查'timeOff> datetime.datetime.now()'。 – cmaher

+0

当您调用它时,将想要使用的'now'值传递给该函数:即timedPump(datetime.datetime.now(),val)'。 (当然,你需要改变函数的定义。) – martineau

回答

0

有关如何计算timedPump缺少一些信息。我想这是一个简单的循环。

需要发生的是必须有两个功能,一个设置turnOff时间,一个评估天气来打开/关闭泵。 这可以被实现为一个类的方法有两种:

class PumpControl(object): 
    def setTime(self, val): 
     now = datetime.now() 
     self.timeOff=now + timedelta(minutes=int(val)) 
     print 'pumpOn' 

    def checkTime(self): 
     if self.timeOff < datetime.now(): 
      print 'pumpOff' 

这样,您将创建一个PumpControl对象,然后重复检查时间:

controller = PumpControl() 
#inside your loop 
controller.checkTime() 
#when you want to set the time 
controller.setTime(val) 

这应该跨线程工作为好,这样你就可以有一个线程重复,另一个线程要求时间。

+0

我刚开始使用线程。我想添加其他任务。我应该让每个任务都是独立的类,然后为主框架中的每个类运行单独的循环吗? –

+0

@Cathy_Hanna我不得不承认,我不使用自己的线程。但是,如果在每个线程中创建一个控制器对象(即,在线程中调用PumpControl(),而不是在外部),我不明白它们会如何干涉。 – GammaSQ

1

这将是我的问题的解决方案:

from time import sleep 

def pumpcheck(timer_in_minutes): 
    time_clicked = datetime.datetime.now() 
    now = time_clicked 
    timeDiff = datetime.timedelta(minutes=int(timer_in_minutes)) 
    while (time_clicked + timeDiff > now): 
     print 'pumpOn' 
     now = datetime.datetime.now() 
     sleep(2) 
    print 'pumpOff' 

它节省了当按钮被一个循环推,然后检查,如果时间rfeached,如果不是,它更新当前时间的时间说,泵仍然打开,睡一会儿,不会惹起CPU的资源。当时间到了,它说pumpoff

+0

虽然这个工作很完美,但我担心当我开始向整个项目添加更多的任务时,睡眠函数将开始干扰(?)。 –

0

这听起来像是一个功能范围之外的东西。将逻辑分成两个函数,或者使用一个类来保存start_time