2

私はこの単純なスクリプトを持っており、なぜ無視しているのかを理解したいと思っていCtrl-Cます。

from Tkinter import *

def main():
    root = Tk().withdraw()

    mainloop()

if __name__ == "__main__":
    main()

SO ( tkinter キーボード割り込みは tkinter フレームが発生するまで処理されません) でこの他の質問を見つけましたが、これは基本的に同じです。残念ながら、答えは私には明確ではありません。after()シグナルをキャッチするには、関数をどのように使用すればよいですか?

さらに、Tkinter は使用するためだけに必要でありtkSnack、ウィンドウを表示したくありません。したがって、それを呼び出すボタンを追加することはroot.quit()できません。

4

2 に答える 2

0

これは、非表示のウィンドウを持つ Tk アプリケーションとして駆動できます。以前の質問のフォローアップと同様に、これはすべて mp3 プレーヤーの一部であり、ここにサンプルがあります。

from Tkinter import *
import sys,tkSnack

def terminate(root):
    root.quit()

def main(args = None):
    if args is None:
        args = sys.argv
    root = Tk()
    root.withdraw()
    tkSnack.initializeSnack(root)
    root.after(5000, terminate, root)
    track = tkSnack.Sound(file=args[1])
    track.play()
    root.mainloop()
    root.destroy()
    return 0

if __name__=='__main__':
    sys.exit(main())

この場合、ルートの Tk ウィンドウを保持しますが、画面にマップされる機会を得る前にそれを撤回します。次に、Tk イベント ループを終了するアプリケーションを終了するイベントを 5 秒間スケジュールします。これにより、すべてを破棄して正常に終了できます。これが機能するのは、play() コマンドによってサウンド トラックの再生が開始され、すぐに戻るためです。サウンド データはイベント ループで処理されるため、イベント ループを実行しないと再生が停止します。

after イベントが早期終了を引き起こさないと、アプリケーションは最終的にファイルからすべてのサウンド データを使い果たし、ハングします。play() メソッドは、再生が終了したときに実行されるコマンドを受け取るため、時間を推測してイベント後に使用するのではなく、適切なタイミングでメインループを適切に終了させることができます。

于 2013-10-04T18:31:30.403 に答える