Pythonと数式の計算

I have some working code that I altered but I can't seem to get the math right for the hours variable. I think I had to much food for the holidays because I'm coming up with a blank.

## {{{ http://code.activestate.com/recipes/124894/ (r2)
from Tkinter import *
import time
import pygtk
import gtk
import time

class StopWatch(Frame):  
    """ Implements a stop watch frame widget. """                                                                
    def __init__(self, parent=None, **kw):        
        Frame.__init__(self, parent, kw)
        self._start = 0.0        
        self._elapsedtime = 0.0
        self._running = 0
        self.timestr = StringVar()               
        self.makeWidgets()      

    def makeWidgets(self):                         
        """ Make the time label. """
        l = Label(self, textvariable=self.timestr)
        self._setTime(self._elapsedtime)
        l.pack(fill=X, expand=NO, pady=2, padx=2)                      

    def _update(self): 
        """ Update the label with elapsed time. """
        self._elapsedtime = time.time() - self._start
        self._setTime(self._elapsedtime)
        self._timer = self.after(50, self._update)

    def _setTime(self, elap):
        """ Set the time string to Minutes:Seconds:Hundreths """
        hours = int(elap) #cant remember formula 
        minutes = int(elap/60)
        seconds = int(elap - minutes*60.0)
        hseconds = int((elap - minutes*60.0 - seconds)*100)
        sn = time.strftime('%m/%d/%Y-%H:%M:%s')                
        self.timestr.set('%02s\n\n%02dh:%02dm:%02ds:%02d' % (sn,hours,minutes, seconds, hseconds))

    def Start(self):                                                     
        """ Start the stopwatch, ignore if running. """
        if not self._running:            
            self._start = time.time() - self._elapsedtime
            self._update()
            self._running = 1        

    def Stop(self):                                    
        """ Stop the stopwatch, ignore if stopped. """
        if self._running:
            self.after_cancel(self._timer)            
            self._elapsedtime = time.time() - self._start    
            self._setTime(self._elapsedtime)
            self._running = 0

    def Reset(self):                                  
        """ Reset the stopwatch. """
        self._start = time.time()         
        self._elapsedtime = 0.0    
        self._setTime(self._elapsedtime)



def main():
    root = Tk()
    root.title( "Stop Watch" )
    sw = StopWatch(root)
    sw.pack(side=TOP)

    Button(root, text='Start', command=sw.Start).pack(side=LEFT)
    Button(root, text='Stop', command=sw.Stop).pack(side=LEFT)
    Button(root, text='Reset', command=sw.Reset).pack(side=LEFT)
    Button(root, text='Quit', command=root.quit).pack(side=LEFT)

    root.mainloop()

if __name__ == '__main__':
    main()
## end of http://code.activestate.com/recipes/124894/ }}}
3
その部分がコードに含まれていたので、私は時間変数を追加したがっていました。私はそれが奇妙に見えるが、それは働くように思われる....
追加された 著者 Rick T,
あなたは分= elap/60と確信していますか?
追加された 著者 Kos,
うーん、downvoterによるドライブの攻撃!すべての答えは何らかの理由でdownvoted!誰かが明らかにこの話題に屈する気がしない。
追加された 著者 David Heffernan,
elap/60です。 time()は、エポックの開始から秒を表す浮動小数点を返します。したがって、1.0は1秒です.3600.0は3600秒などです。
追加された 著者 soulcheck,
downvotesはupvotes未満の価値があること良い
追加された 著者 soulcheck,

4 答え

もう一方の側から作業する方がはるかに簡単です。 86400 のような大きな数字は必要ありません。

c = int(elap * 100) # centiseconds
s, c = divmod(c, 100)
m, s = divmod(s, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
print(d, h, m, s, c)

または、関数呼び出しを避ける:

c = int(elap * 100) # centiseconds
s = c//100; c %= 100
m = s// 60; s %=  60
h = m// 60; m %=  60
d = h// 24; h %=  24
print(d, h, m, s, c)
5
追加された
hahahhaah私が言うよりももっと答えがよかった;-) ...助けてくれた皆さん、本当に助けてくれてありがとう....
追加された 著者 Rick T,
+1それはうまく動作し、うまく読みます。今すぐ他の誰かが来てくれるのを待つだけで、さらに "あなたのコードはうまくいっています...."とコメントするだけです。 ;-)
追加された 著者 David Heffernan,

I infer from the equations that elap is measured in seconds. Since you are extracting hours into a separate variable, you need to remove them from the minutes tally. And of course you need to follow this through the rest of the calculation since the meaning of minutes is changed from the original code.

hours = int(elap/3600)
minutes = int((elap-hours*3600)/60)
seconds = int(elap-hours*3600-minutes*60)
hseconds = int((elap-hours*3600-minutes*60-seconds)*100)

私がこれを書いていたら、重複を減らすために進めていたように elap を修正すると思います。

hours = int(elap/3600)
elap -= hours*3600
minutes = int(elap/60)
elap -= minutes*60
seconds = int(elap)
elap -= seconds
hseconds = int(elap*100)

このようにすると、何が起こっているのかを見極めることが容易になり、将来的には変更が容易になります。たとえば、ミックスに日数を追加したい場合は、これをコードの先頭に移植するだけです。

days = int(elap/86400)
elap -= days*86400

ここでは、 elap float であると仮定してコードを記述しました。あなたが特に編集的だった場合は、算術演算を実行する前に elap = float(elap)を書いてください。

しかし、私は@soulcheckに、ライブラリ関数を使うのがはるかにクリーンであることに同意します。

2
追加された
ありがとう!!!これは本当に助けになった
追加された 著者 Rick T,
あなたのコードは正常に動作しますが、よりエレガントにすることができます。私の答えを見てください。
追加された 著者 John Machin,
hours = int(elap/ 3600)

minutes = int((elap % 3600)/60)

seconds = int(elap % 60) 

hseconds = int((elap % 1) * 100)

たぶんdatetime.fromtimestampで変換して作業する方が良いでしょう。

編集:欠落している数式をすべて追加しました

0
追加された
はい、ありがとうございました!私は二度目の感謝祭に出掛けています...スウェットパンツに感謝します;-)
追加された 著者 Rick T,
これは間に合う限り正しいですが、何秒か何秒か何秒で何ができるかが残っています
追加された 著者 David Heffernan,
私はRick Tがパターンに気付くだろうと仮定した;)
追加された 著者 soulcheck,

現時点ではテストできませんが、 elap というコードは、渡される秒数です。したがって、それを3600で除算し、 int()で切り捨てます。前のコードでこれが意味することは、それが時計の前に90分かかる可能性がありますが、今は1時間30分であるはずです。時間を計算するだけでなく、 hseconds を調整する必要があります。

def _setTime(self, elap):
    """ Set the time string to Hours:Minutes:Seconds:Hundreths """
    hours = int(elap/3600)
    minutes = int(elap/60 - hours*60.0)
    seconds = int(elap - hours*3600.0 - minutes*60.0)
    hseconds = int((elap - hours*3600.0 - minutes*60.0 - seconds)*100)
    sn = time.strftime('%m/%d/%Y-%H:%M:%s')                
    self.timestr.set('%02s\n\n%02dh:%02dm:%02ds:%02d' % (sn,hours,minutes, seconds, hseconds))
0
追加された
あなたのコードは正常に動作しますが、よりエレガントにすることができます。
追加された 著者 David Heffernan,