私はTkに比較的不慣れですが、以前にいくつかの簡単なプロジェクトを行ったことがあり、これは私を困惑させました:
タイムスライダーを表すスケールウィジェットがあります。threading.Timerは、スケールウィジェットを移動するために間隔を置いてオフになります。ボタンを押すと、スレッドは無効になります。ボタンを押すと、スレッドが再び有効になります。そのため、ユーザーはタイムスライダーをクリックしてドラッグし、アプリケーションの「時間」の位置を変更できます。UI操作中にスレッドを無効にすることで、これまでのところ、スレッドの安全性に関連していると思われるクラッシュを防ぐことができました(スレッドがスライダーを更新しようとしたときに発生した、非決定的なクラッシュのようです)。
他の唯一の「アクティブな」UI要素は、command=fncパラメーターを使用して構成された一連のボタンです。スケールは私がbind()を使用している唯一の場所です。このアプリケーションはフルスクリーンアプリなので、ルートレベルでself.root.overridedirect(1)とgeometry()を使用して、メニューと境界線を削除し、フルスクリーンにします。
コードを変更したので、スケールウィジェットは絶対ルートレベルではなくフレーム内にあります。
self.scale_timescrub = tkinter.Scale(self.root.master, from_=0, to=60, width=height_one, orient=tkinter.HORIZONTAL, showvalue=0)
self.scale_timescrub.grid(row=2,column=0,sticky=tkinter.N+tkinter.S+tkinter.E+tkinter.W)
self.scale_timescrub.bind('<Button-1>', self.press_scrub)
self.scale_timescrub.bind('<ButtonRelease-1>', self.release_scrub)
これで、スケールウィジェットを使用してUI操作を実行しようとすると、アプリケーションがハングします。スライダーのどこかを押すとCPUが固定され、アプリが元に戻ることはありません。アプリケーションをハックしてスケールをルートレベルに戻すと、再び機能するため、子育てに関連していることはわかっています。ウィジェットは、フレームにペアレント化されている場合、press_scrubなどのバインドされた関数に入ることがないようです。
誰かが私がここで間違っていることを私にアドバイスできますか?
Windows7でpython3.2.364bを実行します。