1

これが私の状況です。2 つの tkinter ボタンがあります。

  1. 再生ボタン:音を鳴らす
  2. 停止ボタン:演奏中の音を止める

コードは次のとおりです。

def Play(self):
    //plays a file with pygame module

def Stop(self):
    //Stop using pygame stop


Button( root, text ='Play', command= Play).pack()
Button( root, text ='Stop', command= Stop).pack()

問題は、「再生」ボタンをクリックすると、サウンドの再生が完了するまで押したままになり、プログラム全体がフリーズし、その間「停止」ボタンを押すことができないことです。

プレイの進行中にプログラムがフリーズしないようにして、停止などの他の操作を実行できるようにするにはどうすればよいですか?

4

2 に答える 2

1

曲の再生中に GUI がフリーズするのを防ぐ唯一の方法は、別のスレッドまたは別のプロセスを使用して曲を再生することです。曲を再生する関数がメイン スレッドで実行されている限り、イベント ループは実行できません。イベント ループが実行できない場合、GUI はフリーズします。

于 2013-05-15T11:19:17.343 に答える
1

このヒントはここで提案されました

それ以外の:

Button(tkwin, text="Go", command=dosomething)

代わりに:

def delayedDoSomething():
       tkwin.after(100, dosomething)

Button(tkwin, text="Go", command=delayedDoSomething)

あなたのコードのためcustomPlayに、2 番目のスレッドで Play を使って実行したいものを実行するメソッドを書いてみてください。少なくとも、このメソッド書き換えのヒントからインスピレーションを得ることができます。

おそらく、 Tkinter のスレッドセーフバージョンである mtTkinterを使用できます。

Tkinter は技術的にはスレッドセーフですが (Tk が --enable-threads でビルドされていると仮定します)、実際には、マルチスレッドの Python アプリケーションで使用するとまだ問題があります。この問題は、_tkinter モジュールが、他のスレッドからの呼び出しを処理するときに、ポーリング手法を介してメイン スレッドの制御を取得しようとするという事実に起因しています。それが成功すれば、すべてがうまくいきます。失敗した場合 (つまり、タイムアウト後)、アプリケーションは次のメッセージを含む例外を受け取ります。「RuntimeError: メイン スレッドがメイン ループにありません」これがいつ発生するかを知る方法はないため、複数のスレッドから Tk ルーチンを呼び出すことはせいぜい問題があるようです。

于 2013-05-15T06:48:39.283 に答える