0

さまざまな天体の大きなデータベースがあり、GUI でそれらのさまざまな情報を表示できるようにしたいと考えています。しかし、私は大きな問題を見つけており、それを治療する方法があるのか​​ 、それともそのアイデアをあきらめなければならないのかわかりません.

これらのソースごとに、何かをプロットする前に実行する計算がたくさんあります。私の考えは、メインの GUI ウィンドウを開いてから、オブジェクトごとに fo オブジェクトを作成することです。

  1. 最初に計算を行います。情報は、python を使用して mysql コマンドを介してデータベースから取得されます。この段階の終わりには、2 つまたは 3 つの配列がプロットされます。

  2. GUI を使用してこれらのプロットを表示します。この段階で、ユーザーはイベントを使用してクリックすることで、いくつかの悪い点を削除できます (そのため、GUI はデータベースと通信できるはずです)。いくつかの点が削除されると、プロットを更新する必要があります。

  3. 悪い点が削除されると、ユーザーはさまざまなボタンをクリックしてソースを分類できます (「星」、「銀河」、「何でも」としましょう)。

  4. ユーザーがいずれかの分類ボタンをクリックすると、プログラムはデータベース内の次のソースにジャンプし、プロセスが再び開始されます。

問題は、これを行うと root.mainloop() ステートメントと戦わなければならないことです。オブジェクトの計算が複雑なため、多くのコードが関係しているため、わかりやすくするために、このコードを GUI に含めないようにしたいと考えています。しかし、それ以外の場合は、Tkinter ウィンドウを開いて、1 つのオブジェクトを分類し、それを閉じて、新しいオブジェクトを開く必要があります...これには時間がかかり、動揺します...

GUI パーツの外側で計算を行い、パラメータをクリアせずに Tkinter ウィンドウに渡す方法はありますか?

ありがとう!

4

1 に答える 1

1

計算は、ワーカースレッドまたは別のプロセスで実行できます。

単一の計算の場合、1秒未満で実行できますか?もしそうなら、イベントループをあなたに対してではなくあなたのために働かせましょう。なんらかの方法ですべての計算をリスト、イテレーター、またはジェネレーターに入れることができる場合は、を使用して各計算を実行できますafter

大まかに言えば、コードは次のようになります。

def do_one_calculation():

    <do the next calculation here>

    if there_are_more_calculations():
        root.after(100, do_one_calculation)

計算の速さや遅さに応じて、最初のパラメーターをに調整することで、毎秒多かれ少なかれ実行できますafter。正味の効果は、計算が「バックグラウンドで」実行されることです。これは、GUIで言えば、GUIが他の方法で何もしていないときは常に意味します。

于 2013-02-03T22:19:05.993 に答える