1

目標:一連のゆっくりとした激しい運動を交互に繰り返す30分の時間制限のある活動。ウィンドウは、30分から始まるカウントダウンタイマーを表示することから始まります。エクササイズは30秒の「遅い」アクティビティから始まります-タイマーの下に「遅い」という言葉が表示されます。その後、60秒間の激しい運動を続けます。次に、30秒間のゆっくりとしたペース、60秒間の別の激しい運動、というように続きます。全部で、4つの異なる激しいエクササイズがそれぞれゆっくりとしたペースで交互に行われます。

以下のコードをまとめました。直感的だとは思いません。私はメソッドをバウンスするのが好きではなく、これをより効率的にするために使用できるメソッドがそこにあると感じています。実用的なレベルでは、これはタイマーとメッセージ(つまり、遅い/エクササイズ#が表示される)が同期しなくなり始めるため、うまく機能しません。私はPythonブログを調査し、Tkinterがマルチスレッド化されていないことについて何かを「聞き」続けています。カウントダウンスレッドがリソースを消費するため、after(x、y)が危険にさらされるようになると思います。また、各メソッドの後に「アスリート」のオーディオキューとしてトーンを追加したいと思います。とにかく、私の粗いコードを見てくれてありがとう。

 import Tkinter as tk

 class ExampleApp(tk.Tk):
     def __init__(self):
         tk.Tk.__init__(self)
         self.label = tk.Label(self, text="", width=10, font= ("Helvetica",72), background='yellow', fg = 'red')
         self.label2 = tk.Label(self, text="", width=10, font=("Helvetica",72), background='yellow', fg = 'blue')
         self.label.pack()
         self.label2.pack()
         self.remaining = 0
         self.countdown(1800)  # the 30 minutes countdown  initialization
         self.run = True 

     def countdown(self, remaining = None):
         if self.remaining == 1799:  # marker that starts the methods series
             self.start()
         if remaining is not None:
             self.remaining = remaining
         if self.remaining >= 1:
             mins = int(self.remaining/60)
             #rsecs = self.remaining - mins * 60 #could use this
             rsecs = self.remaining % 60     #same results as t - mins * 60
             self.remaining = self.remaining -1
             self.after(1000, self.countdown)
             self.label.configure(text ="%.2f" % (mins + rsecs / 100.0))
         else:
             self.label.configure(text="Stop")

     def start(self):
         app.after(0, self.slow1)
         return

     def slow1(self):
         self.label2.configure(text="Slow" )
         app.after(30000, self.fast1)
         return

     def fast1(self):
         self.label2.configure(text="Exercise 1" )
         app.after(61000, self.slow2)
         return

     def slow2(self):
         self.label2.configure(text="Slow" )
         app.after(31000, self.fast2)
         return

     def fast2(self):
         self.label2.configure(text="Exercise 2" )
         app.after(61000, self.slow3)
         return

     def slow3(self):
         self.label2.configure(text="Slow" )
         app.after(30000, self.fast3)
         return

     def fast3(self):
         self.label2.configure(text="Exercise 3" )
         app.after(60000, self.slow4)
         return

     def slow4(self):
         self.label2.configure(text="Slow" )
         app.after(30000, self.fast4)
         return

     def fast4(self):
         self.label2.configure(text="Exercise 4" )
         app.after(60000, self.slow1)
         return

 if __name__ == "__main__":
     app = ExampleApp()
     app.title("Intense Workout")
     app.geometry('550x550+200+200')
     app.configure(background='yellow')
     app.mainloop()
4

1 に答える 1

1

この問題を解決する方法はたくさんあり、スレッドは必要ありません。ここに1つのアイデアがあります:

間隔を定義するデータ構造から始めます。例えば:

intervals = [[30, "slow"], [60, "intense"], [30, "slow"], [60, "intense]]

次に、1秒に1回呼び出される単純なタイマー関数を設定します。毎秒、リストの先頭にある番号と文字列が表示されます。数字は残り時間を表します。そのタイマー機能で、数値から1を引きます。ゼロになった場合は、その要素をリストから削除します。この関数は、1秒後に、を使用して自分自身を呼び出しafter、データ構造が空になったときに停止します(つまり、ペアが1つだけ残っていて、数がゼロになったとき)。

以下は、これを実装する方法についてのアイデアを提供します。コードを改善することはできますが、重要なのは、を使用してデータ構造を反復処理する方法を説明することafterであり、必ずしも本番品質の例を示すことではありません。

import Tkinter as tk

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.label = tk.Label(self, text="", width=10, font= ("Helvetica",72), background='yellow', fg = 'red')
        self.label2 = tk.Label(self, text="", width=10, font=("Helvetica",72), background='yellow', fg = 'blue')
        self.label.pack()
        self.label2.pack()
        self.intervals = [[30, "Slow"], [60, "Exercise 1"],
                          [30, "Slow"], [60, "Exercise 2"],
                          [30, "Slow"], [60, "Exercise 3"],
                          [30, "Slow"], [60, "Exercise 4"],
                          ]
        self.countdown()

    def countdown(self):
        (remaining, label) = self.intervals[0]
        self.label.configure(text=remaining)
        self.label2.configure(text=label)
        remaining -= 1
        if remaining < 0:
            self.intervals.pop(0)
        else:
            self.intervals[0][0] = remaining
        if len(self.intervals) > 0:
            self.after(1000, self.countdown)
        else:
            self.label.configure(text="Done!")

if __name__ == "__main__":
    app = ExampleApp()
    app.title("Intense Workout")
    app.geometry('550x550+200+200')
    app.configure(background='yellow')
    app.mainloop()
于 2012-08-15T12:50:11.757 に答える