0

わかりましたが、これはあまり明確なタイトルではないので、これでもう少し明確になることを願っています (誰かがより明確な名前を思いつくことができれば、助けていただければ幸いです!)。

幼稚園のクラスのポイント トラッカーを作成しています。頭に浮かぶのは、下が 0 で上が 100 のバーと、0 から 100 まで上下にスキャンするカラー グラデーション ポイント バーです。タッチ スクリーンに触れると、バーがフリーズし、チームは x ポイントを獲得します。ここで、x はバーがフリーズする数です。

現在、私はバーを動かす機能に取り組んでいます(まだフリーズ/割り込みを入れていません)。私はこれをまとめましたが、それは本当に優雅で醜く感じます.

def score_inc():
    x = 0
    while x < 100:
        x += 1
        time.sleep(0.01)
    while x > 100:
        x -= 1
        time.sleep(0.01)

言うまでもなく、このコードが操作をブロックすることは十分に確信しています。つまり、グラフィックを表示/更新できませんでした。

これは GUI プログラミングへの私の最初の進出なので、グラフィカル フロントエンドを作成する前に慎重に GUI を使用しないバックエンドを作成しようとしていますが、それは間違ったルートですか? より適切な用語がないため、「GUI対応」の関数を使用して、このようなものを実装するためのよりスムーズで見苦しくない方法はありますか?

4

2 に答える 2

1

wxPython では、おそらく wx.Slider を使用したいと思うでしょうが、探している色をサポートしているとは思いません。ただし、スライダー イベントを wx.GCDC または wx.PaintDC に関連付けることができる場合があります。他の提案については、wxPython ユーザーのグループに尋ねたいと思います。

GUI のメインループをブロックしている time.sleep() については正しいです。そのようにすると、GUI は応答しません。代わりに、wx.Timer を使用する必要があります。ここにそれに関するチュートリアルがあります。time.sleep() をスレッドに入れることもできますが、それはやり過ぎで、不必要に複雑になると思います。

于 2012-07-05T14:25:22.910 に答える
1

バーの移動を実装する最も簡単な方法は、別の関数ではなく、割り込みと同じループ内にあります。

def barLoop():
    current_score = 0
    increment = True
    while True:
        ## HANDLE INTERRUPT HERE ##
        if increment:
            current_score += 1
            if current_score == 100: #stop incrementing at 100
                increment = False
        else:
            current_score -= 1
            if current_score == 0: #start incrementing again at 0
                increment = True 

これには、割り込みによってキャプチャされるようにスコア変数を公開したままにしておくという利点があります。バーの位置をグラフィカルに更新するために呼び出す必要がある GUI 関数は、if/else ブロック内で呼び出すことができます。これにより他のイベント ループがブロックされるため、これをメイン ループとして単純に使用し、quit やその他の応答が必要なイベントを処理するのが最善の方法です。

于 2012-07-05T16:31:39.353 に答える