2011-07-14 5 views
2

私はボタンをクリックすると私のカウントダウンタイマーにX時間を追加するアプリケーションがあります。pythonはすでに実行中のカウントダウンに時間を追加します

私はここ..私はこのためにスレッドを使用する必要がありますが、それを実装する方法を確認していない

を推測しているが、私が持っているコードは、これまでのところです:

def countdown_controller(add_time): 
    end_it = False 
    def timer(time_this): 
     start = time.time() 
     lastprinted = 0 
     finish = start + time_this 
     while time.time() < finish: 
      now = int(time.time()) 
      if now != lastprinted: 
       time_left = int(finish - now) 
       print time_left 
       lastprinted = now 
      if end_it == True: 
       now = finish 
      time.sleep(0.1) 
    # Check if the counter is running otherwise just add time. 
    try: 
     time_left 
    except NameError: 
     timer(add_time) 
    else: 
     if time_left == 0: 
     timer(add_time) 
     else: 
      add_this = time_left 
      end_it = True 
      while now != finish: 
       time.sleep(0.1) 
      timer(add_time + add_this) 

明らかにこれは動作しません。私がcountdown_controller(15) fxと呼ぶたびに、15秒間カウントダウンを開始し、私のボタンをクリックすると、タイマーが終了するまで何も起こらないからです。

助けていただければ幸いです。

答えて

1

何もしないプログラム全体(time.sleep(0.1))ダウンあなたの画面出力ブロックので、私は、コードの設計に欠陥があることを言うでしょう。

通常、これらの場合に実行したいのは、プログラムにを実行させるさまざまな操作を繰り返すメインループを持つです。これにより、さまざまなタスク間のシステムリソースの分かりやすい配布が保証されます。あなたのメインループで持ちたいものをあなたの特定のケースでは、

は次のとおりです。

  • チェック、ユーザー入力(余分な時間が追加されている?)
  • カウントダウン
の更新出力

実装例:

import time 
import curses 

# The timer class  
class Timer(): 
    def __init__(self): 
     self.target = time.time() + 5 
    def add_five(self): 
     self.target += 5 
    def get_left(self): 
     return int(self.target-time.time()) 

# The main program 
t = Timer() 
stdscr = curses.initscr() 
stdscr.nodelay(True) 
curses.noecho() 
# This is the main loop done in curses, but you can implement it with 
# a GUI toolkit or any other method you wish. 
while True: 
    left = t.get_left() 
    if left <= 0: 
     break 
    stdscr.addstr(0, 0, 'Seconds left: %s ' % str(left).zfill(3)) 
    c = stdscr.getch() 
    if c == ord('x') : 
     t.add_five() 
# Final operations start here 
stdscr.keypad(0) 
curses.echo() 
curses.endwin() 
print '\nTime is up!\n' 

上記プログラムは、カウンタを増加させますxキー(小文字)を押すと5秒間表示されます。ほとんどのコードはcursesモジュールを使用するためには定型ですが、もちろんPyGTK、PySide、その他のグラフィカルツールキットを使用する場合は違います。

EDIT:経験則として、それはしばしば(常にではない)プログラムを遅く両方のため(「Global Interpreter Lock」を参照)、それはソフトウェアを作るため、Pythonであなたは、あなたができる限り多くのスレッド避けたいですデバッグ/保守が難しくなります。

HTH!

+0

私のコードであなたのアイデアを試してみましょう。私はすでに他の鳴き声をチェックしているメインループを持っているので、私はあなたの考えが本当に好きです。 –

0

finish属性を持つTimerオブジェクトがありますが、単純にintを追加できます。もう1つのスレッドでtimerを実行していて、GUIから残りの現在の時間を問い合わせることができます。

class Timer(object): 
    def __init__(self, length): 
     self.finish = time.time() + length 

    def get_time(self): 
     return time.time() >= self.finish 
関連する問題