1

キーを押すだけでタイマーを開始または停止したいというテストケースを作成していますが、ルーチンを存続させる方法がわかりません...'g'はタイマーを開始する必要があります(そして継続的に繰り返す必要があります) )、および's'はタイマーを停止する必要があります。その後、「g」はタイマーなどを開始できます。代わりに、「g」はタイマーを開始し、「s」は何もしません。私は何が間違っているのですか?

コード:

#!/usr/bin/env python

import time, sys 

def print_something(status):
    while(status):
        print 'the time: ' , time.ctime()
        time.sleep(1);

def main():
    result = 1 
    print 'starting time: ' , time.ctime()

    result = raw_input('press g to start timer, s to stop.\n')
    while(result is 'g'):
        print_something(True)
        result = ''

    result = None
    time.stop()

main()
4

2 に答える 2

1

あなたの主な問題は、あなたが読み込もうとしているstdinが、制御フローがprint_something関数(この場合は無限ループ)でスタックしていて、そこから離れないことです。つまり、ユーザーが入力したときに「s」を読み取りたいのですが、ループが終了するまでコードのその部分は実行されません。

なんらかの中断が必要になります。次のコードは目的を達成しますが、ユーザーは「Ctrl+C」を押してタイマーを停止する必要があります。

#!/usr/bin/env python

import time, sys 

def main():
    result = 1 
    print 'starting time: ' , time.ctime()

    while(result):
        result = raw_input('press g to start timer, ctrl+c to stop.\n')

        if result is 'g':
            print_something()
            result = ''
        else:
            result = None
            time.stop()
            sys.exit()

def print_something():
    while 1:
        try:
            print 'the time: ' , time.ctime()
            time.sleep(1);
        except KeyboardInterrupt:            
            break
main()

編集:

これが私が欲しいものです:1。プログラムを開始する2. gを押す、タイマーを開始する3. sを押す、タイマーを停止する4. gを押す、タイマーを開始するなど。CTRL-Cはタイマーを停止する方法ではなく、強制終了する方法です。プログラム。

次に、プログラミングパラダイムを変更する必要があります。キーを押すなどのイベントに応答するイベント駆動型プログラムを考えています。おそらく、どのキーが押されたかを取得し、別のスレッドが時間を出力している間にまたはが押された場合にそれに応じて動作するスレッドを作成する必要があります。sg

于 2013-02-26T04:00:57.920 に答える
-1

whileループを関数内に移動してみてくださいmain

def main():
result = 1
print 'starting time: ' , time.ctime()
while(result):
result = raw_input('press g to start timer, s to stop.\n')

if result is 'g':
    print_something()
    result = ''
elif result is 's':
    result = None
    time.stop()
    sys.exit()

更新: のテストを試みましたwhile(result != 's')か?

于 2013-02-26T02:40:24.987 に答える