機能の:PyGTK(Nokia N900のために甘やかします)、自己修正コード、設定ファイルを台無しにしないように。
伝統により、叙情的な紹介。
過去2年間にジムに行くことは、集中的なトレーニングと必要な筋肉群の思慮深いポンピングよりも、私にとって社会的な出来事でした。 異なるが近くの科学分野の2人または3人の博士課程の学生が1か所に集まり、3人全員が舌をこする自然な魅力がこれに加わると、この意識の流れを止めることはできません。
しかし、運命の意志によって、そして悪い言い方をすれば、私たちの会社は崩壊しました。 壊滅的な時間の不足と、一方ではスケジュールに同意する能力、もう一方では古い怪我のために、私はこの3か月だけでジムに通いました。 そして、正直に言うと、私もそれを後悔していません。
疑問が生じ、決定を下す必要があったとき、この「悪い」レッスンをやめるか、逆に真剣に受け止め、トレーニングプログラムを熟考し、主題に関する理論的知識を獲得するために、状況の組み合わせが役立ちました。 私の兄弟(
akusto )は
5x5のワークアウトを非常に時間通りに見せ、それを彼自身が数週間使用しました。 彼女は
bodybuilding.comの多くのプログラムの中で1位になりました。 簡単に言えば、エクササイズとセットの間の休憩時間を固定して、すべての主要な筋肉グループに対して5セット5セットで4日間と説明できます。 後者は私にとって非常に重要でした。 このアクションに特定の強調と完全性を与えるのは、指定されたトレーニング時間であるためです。 さらに、同じ
bodybuilding.comで評価された最高のエクササイズから選択されました。
毎週の時間と義務的な体重増加の厳格な要件により、次の運動を開始し、バー/ダンベルの重量を維持する必要性を報告する独自のプログラムを作成し、必要に応じて増やすことができます(トレーニング条件、体重に応じて) 5x5のすべての担当者を完了できた場合は増やす必要があります)。
お気に入りのIDEを開いて、そこに数行のPythonを取得します。 コードがHabrに対して少し長いことが判明したため(〜251行)、
このリンクをクリックして完全なシートを理解することをお勧めします。
次に、部分的に分析します。
すべての使用済みモジュールを接続したら(行7-14)、プログラムクラスを作成します。 これは主に、関数(まだコードに含まれていない)が変数の単一の名前空間にアクセスして使用できるようにするためだけに行われます。 19行目から、これらの非常に一般的な変数が初期化されています(それらをグローバルと呼ぶことは、コンピューターサイエンスの観点からは少し間違っています)。
self.exercise_list変数には、曜日から始まる演習のリストが含まれています。 各行には、エクササイズの名前と、ポンド(ポンド、州のキログラムがまだ根付いていない)単位の作業重量が含まれ、その後ろに「x5」という文字があります。 彼らは偶然にそこに置かれました。 これら2つの文字から、前の数字が重量であると判断します。 これは、象徴的に「5x5」トレーニングプログラムが使用されていることを示しています。
たとえば、水曜日(36行目)などの自由な曜日には、変数には曜日の名前の行のみが含まれます。 水曜日に実行用のスクリプトを含めると、この曜日の名前のみが表示されます。
行57〜68は、スクリプト実行パラメーターを決定する変数を設定します。
スクリプトの主な機能は次のとおりです。これについては後で検討します。
189行目から、メインプログラムの実行サイクルが開始され、クラスオブジェクトが作成されます。 行198〜201には特に注意を払う必要があります。 それらの中で、実行可能な
pygym.srcfileスクリプトへのパスを見つけ、
pygym.srcのソースPythonコードを
読み取ります。 これは、設定ファイルを個別に保存することなく、後でソースコードを変更して保存できるようにするためです。 つまり、コード自体が変更されます。
後続の行はすべてGTKであり、メインウィンドウのウィジェットの説明をhildonizeします。これは199行目で作成し、247番目に表示します。 次に、メインのGTKループが実行されます。
これがそのようなスケルトンです。 しかし、私たちは彼が何ができるかをまだ理解していません。 プログラムのメインクラスの機能を見てみましょう。
- def create_labels ( self ) :
- 自己 。 ラベル = [ ]
- 自己 。 exlist = self Exercise_list [ self 。 平日 ]
- 自己の元のために 。 exlist 。 分割 ( ' \ n ' ) :
- 自己 。 ラベル 追加 ( gtk。 ラベル ( ex ) )
- 自己 。 ex_vbox pack_start ( self。labels [ -1 ] 、 True 、 True 、 0 )
- 自己 。 bold_label ( )
- 自己 。 ex_vbox show_all ( )
この関数は、演習を
gtk.labelの配列としてリストします。 3行目では、週のすべての演習のリストから、現在の日付
self.weekdayを選択します。
splitで複数行の変数を別々の行に
分割し、それらを垂直コンテナー
self.ex_vboxに追加します。 アクティブなエクササイズ(より正確には、これは現時点で編集可能なエクササイズです)を強調表示(太らせる)する
脱毛機能を開始し、垂直コンテナとそのすべての新しいコンテンツを表示します。
- def bold_label ( self ) :
- 自己の 場合 。 active_ex ! = -1 :
- 自己 。 ラベル [ self 。 active_ex ] 。 set_markup ( '<b>' + self。labels [ self。active_ex ] 。get_text ( ) + '</ b>' )
- def debold_label ( self ) :
- 自己 。 ラベル [ self 。 active_ex ] 。 set_text ( self.labels [ self.active_ex ] .get_text ( ) )
すべてが書かれているかのようです:マークアップの助けを借りて最初の関数は、アクティブな運動に
太字のタグを追加し
ます 。 2番目はこれらのタグを削除します。
- def pause ( self 、pause_time、set_number = None ) :
- start_t = 時間 。 時間 ( )
- while ( time。time ( )- start_t < pause_time ) :
- temp_t = 時間 。 時間 ( )
- 時間中 。 時間 ( ) -temp_t < 1 :
- 一方、 gtk。 events_pending ( ) :gtk。 main_iteration ( )
- 時間 。 スリープ ( self。sleep_time )
- set_numberの場合 :
- 自己 。 ステータス 。 set_text ( self。excercise。get_text ( ) + 'set#%i' % ( pause_time-
- 時間 。 時間 ( ) + start_t、set_number ) )
- その他 :
- 自己 。 ステータス 。 set_text ( self。excercise。get_text ( ) + ' \ n %03i seconds left' % ( pause_time-time。time ( ) + start_t ) )
- pause_time > selfの場合 。 pause_rep および int ( pause_time- time。time ( ) + start_t ) == self pre_ex :
- os 。 system ( 'dbus-send --print-reply --system --dest = com.nokia.mce / com / nokia / mce / request com.nokia.mce.request.req_vibrator_pattern_activate string: "PatternChatAndEmail"> / dev / null ' )
- pause_time > selfの場合 。 pause_rep :
- os 。 system ( 'dbus-send --print-reply --system --dest = com.nokia.mce / com / nokia / mce / request com.nokia.mce.request.req_vibrator_pattern_activate string: "PatternChatAndEmail"> / dev / null ' )
プログラムの主な機能の1つは、最も不適切な瞬間に一時停止と振動を待つことです...行番号6は重要です。オンにしないと、アプリケーションはクリックに応答せず、画面を更新しません。 これは、GTKがアプリケーションのすべてのメッセージとイベントをチェックして処理するための単なる指示です。 14行目と16行目では、外部プログラムが呼び出され、長い振動(約1秒)のDBusメッセージが送信されます。 これは、DBusモジュールを接続し、外部アプリケーションを引き起こさずにすべてpython内で実行することができるため、少し汚いアプローチです。 しかし、それはただ怠lazでした!
そして最後に、最もおいしい-自己変更コード。
- def weight_change ( self 、button ) :
- 自己の 場合 。 active_ex > 0 :
- ex = self ラベル [ self 。 active_ex ] 。 get_text ( )
- lmatch = re 。 検索 ( "([0-9。] *)x5" 、ex )
- lmatchの場合 :
- ボタンの場合 。 get_label ( ) == '+' :
- new_weight = self 。 weight_increment + float ( lmatch。group ( 1 ) )
- elifボタン。 get_label ( ) == '-' :
- new_weight =-self。 weight_increment + float ( lmatch。group ( 1 ) )
- new_weight == int ( new_weight )の場合 :
- new_weight = '%i' % new_weight
- その他 :
- new_weight = '%.1f' % new_weight
- new_text = ex [ :lmatch。 start ( 1 ) ] + new_weight + ex [ lmatch。 終了 ( 1 ) : ]
- 自己 。 ラベル [ self 。 active_ex ] 。 set_text ( new_text )
- 自己 。 bold_label ( )
- 自己 。 src = re 。 sub ( ex、new_text、self。src )
- 自己 。 write_source ( )
- エリフセルフ 。 active_ex == 0 :
- #if self.start.get_property( "visible"):
- 自己の元のために 。 ラベル :
- 例 破壊 ( )
- ボタンの場合 。 get_label ( ) == '+' :
- 自己 。 weekday = ( self。weekday + 1 ) % 7
- elifボタン。 get_label ( ) == '-' :
- 自己 。 weekday = ( self。weekday - 1 ) % 7
- 自己 。 create_labels ( )
- その他 :
- ヒルドン。 hildon_banner_show_information (ボタン、
- 「0」 、 「「v」または「^」ボタンを使用してエクササイズを選択してください」 )
- def write_source ( self ) :
- #ソースコードを書き戻す
- f = open ( self。srcfile 、 'w' )
- f。 書き込み ( self。src )
- f。 閉じる ( )
ここでは2つの機能について説明します。 1つは重量変更ボタンが押されたときに呼び出され、2つ目は変更されたソースコードを保存します。 4行目は、末尾に文字「x5」が付いた数値の正規表現を検索します。 おそらく、このような単純な場合にREを使用するのは多すぎます。 しかし、複雑なコードの一般的な場合にこれがどのように機能するかを示したかったのです。 必要な数字を見つけたら、押されたボタンに応じてそれらを変更します-現在の体重からself.weight_incrementを加算/減算します。 10行目から13行目まで、数字をドットなしの整数または小数点以下1桁の小数に変換します(またはドットの後...混乱しました)。 そして、新しい値をすでに保存し、古い行で置き換えています(14)。 この置換をプログラムのソースコードで置き換え(17)、ファイルに保存します(18 => 32)。 行19〜30は、曜日変更イベントを処理します。 つまり、プログラムでは、現在の日付だけでなく、他の曜日のプログラムも表示して実行できます。
今日はこれでおそらくすべてです。 ご注意いただきありがとうございます。あなたはPhDで書かれた重量挙げVadikusでした。