3

ここ (または率直に言って、どこのフォーラムでも) に初めて投稿しますが、ウィンドウの終了ボタン [x] が押されたときに終了できないのはなぜだろうと思っていました。私が試してみました:

#print "Exit value ", pygame.QUIT
for et in pygame.event.get():
    #print "Event type ", et.type
    if et.type == pygame.KEYDOWN:
            if (et.key == pygame.K_ESCAPE) or (et.type == pygame.QUIT):
                    print "In Here"
                    return True;
pygame.event.pump()# not quite sure why we do this
return False;

[x]をクリックすると、イベントタイプが「12」を出力するプログラムを実行すると、pygame.QUITが12の値を出力することがわかりました。これらの場合、「In here」文字列は出力されません。return が true の場合 (キーボードで ESC を押した場合)、プログラムは正しく終了します。私はいくつかの関連する問題を見てきました:

私はIDLEで実行していません。次で実行しています:

Eclipse Juno Service Release 1.
Python 2.7.3 と 2.7 用の最新バージョンの pygame (2013 年 3 月 4 日現在)。
Windows 7 & 8 および Ubuntu 12.04LTS (Ubuntu でのサウンドカードなしエラー以外は同じ結果)

プログラムを実行する.pyファイルをダブルクリックしてWindows 7で実行しましたが、[x]で終了しません。前もって感謝します。

4

2 に答える 2

2

イベントループでは、

#print "Exit value ", pygame.QUIT
for et in pygame.event.get():
    #print "Event type ", et.type
    #-----------------------------------------------------------------#
    if et.type == pygame.KEYDOWN:
            if (et.key == pygame.K_ESCAPE) or (et.type == pygame.QUIT):
    #-----------------------------------------------------------------#
                    print "In Here"
                    return True;
pygame.event.pump()  # not quite sure why we do this
return False;

問題( 2 の間#------------#
その部分を分析しましょう:

  1. if ブロックに入ると、et.type == KEYDOWN
  2. の小切手QUITは にありif et.type == KEYDOWNます。
  3. et.typeですのでKEYDOWN、あり得ませんQUIT..
  4. したがって、et.type == QUIT
    X」をクリックしてもウィンドウが終了しません。

何をすべきか?の条件を引き出し
ます。次のようなものです。QUITKEYDOWN

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
                break # break out of the for loop
        elif event.type == pygame.QUIT:
            done = True
            break # break out of the for loop
    if done:
        break # to break out of the while loop

    # your game stuff

ノート:

  • ;これらの return ステートメントの後に必要はありません
  • event.type次のように、常に異なる if-elif ブロックをチェックインします。

    if event.type == pygame.QUIT:
         #...
    elif event.type == pygame.KEYDOWN:
         #...
    
  • そこは必要ありません。ここpygame.event.pump()を参照してください
于 2013-03-05T12:01:15.167 に答える
2

メインループは次のようになります

done = False
while not done:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE: done = True
        elif event.type == QUIT:
            done = True

    # draw etc...
    pygame.display.update()

次に、「完了」をどこかで切り替えると、うまく終了します。

于 2013-03-05T03:11:22.013 に答える