5

背景として、私はDebian Lennyを実行しており、GNOMEとFluxboxの両方でこれを試しました。

とにかく、私はデスクトップで描画する方法を探していました、そして私はここでこのコードを見つけて試しました:http: //blog.prashanthellina.com/2007/08/24/drawing-on-your-desktop/

(コントロールCを押すことによって)終了すると、Xは新しいウィンドウを作成する機能を失うことを除いて、正常に機能しました。

おそらく問題はpygameがリソースを解放しないことだと思っていたので、killシグナルをトラップするコードのブロックを追加して、次のようにしました。

"""
Run the following command in the shell before executing this script
export SDL_WINDOWID=`xwininfo -root|grep "id:"|sed 's/^.*id: //'|sed 's/ (.*$//'`
"""
import pygame
import sys
import random
import time
import signal





pygame.init()

window = pygame.display.set_mode((1280, 1024))
screen = pygame.display.get_surface()


def handle_sigint(signum, frame):
   """I want to ensure resources are released before bailing."""
   print("SIGINT received.");
   pygame.display.quit()
   pygame.quit()
   sys.exit(0)


# Set handler to catch C^C Interupts
signal.signal(signal.SIGINT, handle_sigint)


while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit(0)

    x = random.choice(range(640))
    y = random.choice(range(480))
    radius = random.choice(range(100))
    col_r = random.choice(range(255))
    col_g = random.choice(range(255))
    col_b = random.choice(range(255))

    time.sleep(.03)
    rect = pygame.draw.circle(screen, (col_r, col_g, col_b), (x,y), radius)
    pygame.display.update(rect)

そして、もう一度やり直しました。割り込みハンドラーのprintステートメントは、終了時にハンドラーが実行されることを示していますが、それでも同じ問題が発生します。さらに興味深いことに、Xの実行中は問題はありません。それはそれを終了した後でのみです。

誰かが何が起こっているのか、そしてXセッションを壊さないようにコードを修正するために私ができることを知っている人はいますか?前もって感謝します。

4

1 に答える 1

1

質問、アイデア、試すべきこと:

  1. -c を試す前に端末を起動していた場合、その後も入力できますか? はいの場合、x サーバーではなく、セッションまたはウィンドウ マネージャーに問題がある可能性があります。
  2. Ctrl-Alt-Backspace を試しましたか? これで問題は解決しますか?
  3. gtk-window-decorator と x-session-manager はまだ実行されていますか?

pygame は通常、ウィンドウから実行され、通常はそれ自体の後でクリーンアップを試みます。pygame.display.quit() への明示的な呼び出しを追加しましたが、これで何かが変わるとは思いません。pygame は、SDL_WINDOWID 変数によって参照されるウィンドウを削除しようとします。実際にルート ウィンドウの削除に成功することは、おそらく悪いことです。あなたがこれを入手した人物で、ubuntu、pygame を実行している人物は、許可がないため、ウィンドウの削除に失敗したと思います。あなたのOSにあるかもしれません。

ルート ウィンドウを強制終了するのは悪いことなので、ルート ウィンドウの制御を nautilus (gnome) に戻すだけではどうですか? みたいなgconftool-2 --type bool --set /apps/nautilus/preferences/show_desktop true

于 2009-09-15T03:01:37.403 に答える