2016-04-15 4 views
1

3つのサブ質問:
[1] pythonのGUIはポーリングベースですか?
guiがexcecuteに時間がかかる関数を呼び出すと、tkとqtpyの両方がポーリングベースであるように見えますが、gui全体がハングします。
私は長年前にGUIについて学びました。私は現代のGUIは割り込みベースでなければならないと思いました。GUIが何か大きなものを実行していたとしても、GUIは常に応答するはずです。 [2] tk.mainloopです
Python3、tkinter-mainloop()やQtPy-exec_()のような「GUIループ」を理解する

#psuedo code 
    root=tkinter.Tk() 
    root.setInterruptMode(True) 

:のようなオプションがあり、だから私の質問は、アニメーションなどのGUIは、それらの大きい計算から結果が表示されないかもしれないが、それはサイズを変更して応答します、[表示]ボタンをクリック()ちょうど巨大なループ?
私の最初の質問がパイプドリームで、スレッド化とマルチプロセスについて学ばなければならない場合、次の質問はroot.mainloop()(またはqtpyのexec_())です。
私の印象は、mainloop()は実際にはスレッドやその他のものをpythonで起動しないということです。巨大で見えないtkinterのguiポーリング+ペイントループを私のメインラインにパックするだけです。私の印象は正しいですか?

[3]なぜmainloopをメインラインに入れるのですか?
mainloop()はメインラインに存在する必要がありますか?それをスレッド化/マルチプロセッシングできますか?メインラインは大きな計算に集中でき、メインラインはGUIプロセスとIOプロセスを管理します。私が遭遇したすべての例は、メインラインにmainloop()を持っています。私はそれが推奨されるアプローチであるか、何のメリットがあるかはわかりません。

import tkinter 
    import random 

    class myGUI(): 
     def __init__(self, arg_tkroot): 
      self.GUI_display = tkinter.Label(arg_tkroot, text='init-ed') 
      self.GUI_button = tkinter.Button(arg_tkroot, text='click') 
      self.GUI_display.pack() 
      self.GUI_button.pack() 

      self.GUI_button.bind('<Button-1>', self.handle_user_interaction) 
      self.list_bigData = [] 

     #handles GUI interaction, and call bigData_and_bigCalculation() 
     def handle_user_interaction(self, arg_event): 
      print(arg_event, ' detected by myGUI') 
      strResult_toFeedbackToUser = self.bigData_and_bigCalculation() 
      self.GUI_display.config(text=strResult_toFeedbackToUser) 
      print('finished handling user interact') 

     # slow calculations and memory consuming operations 
     def bigData_and_bigCalculation(self): 
      self.list_bigData[:]=[] 
      for i in range(500000): 
       self.list_bigData.append(''.join(random.choice('asdfas') for k in range(10))) 
      return self.list_bigData[-1] 
    # Main() 
    if __name__ == '__main__': 
     root = tkinter.Tk() 
     mygui = myGUI(root) 
     root.mainloop() 
+1

GUIスレッドで長いジョブを実行すると、GUIがフリーズします。これを避けるには、ジョブごとに異なるスレッドを生成します。面白い質問; – ForceBru

+0

;私は約10小さなと1つの平均サイズのアプリを書きました(Qtではない)応答性のアイデアを決して持っていなかったし、TkはGUIのです:)私は一般的には、私のGUIアプリケーションのためにKivyを使用するように移動したことで、Tkよりも柔軟性があり、必要に応じてAndroidやiosでうまく動作することをお勧めします。 – Drako

+0

私はスレッド化を使用することを恐れ、マルチプロセスは避けられません。しかし、私の最初のサブ質問では、私が "割り込み"をベースにしたgui(Javaアプレットの当時)について学んだことがあったのですが、私は決してguiを止めず、間違った印象でした。 – YunliuStorage

答えて

1

[1]のGUIがポーリング基づいています:

以下

はPythonのGUIについて学ぶためにしようとしているときに、私が書いたコードのですか?

GUIはイベントベースです.GUIで発生するすべてのイベントは、イベントに対する応答です。アプリケーションがイベントをどのように処理するかは、アプリケーションによって決まります。イベントの処理が数百ミリ秒以内に発生する可能性がある場合は、メインスレッドで処理できます。時間がかかる場合、アプリケーションは別のスレッドまたはプロセスでコードを実行する必要があります。

Tkinterの場合、Tkinterは1つのスレッドで実行するように設計されています。つまり、スレッドを使用できないというわけではなく、tkinterオブジェクトへのすべてのアクセスが単一のスレッド上になければなりません。これを行う一般的な方法は、他のスレッドがスレッドセーフなキューを介してGUIと通信することであり、GUIスレッドはそのキューを定期的にチェックする必要があります。

だから私の質問は、Tkinterでは[root.setInterruptMode(True)]

のようなオプションがありますされて、いや、特別な「割り込み」モードを入力する方法はありません。

[2]ちょうど巨大なループですか?

「それ」とは、mainloopへの呼び出しを意味します。はい、それは巨大なループです。あるいはもっと正確には、それは小さなループです。イベントを待つだけで、イベントのハンドラを検索してハンドラを実行します。

私の印象はメインループ()は本当に

正しいPythonでスレッドまたは何も起動しないということです。現在のスレッドでイベントループを実行します。

[3]なぜmainloopをメインラインに入れるのですか?

あなたは、元の開発者に尋ねなければなりません。おそらくそれは、非常に大きな割合のアプリケーションに必要なことだからです(おそらく、ツールキットが発明されたときよりも真実であるかもしれません)。

Tkinterはtkツールキットがインタープリタにロードされたtclインタープリタのラッパーです。 tcl/tkは他のアプリケーションに組み込まれるように設計されているため、軽量で、スレッドをサポートしていないシステムでも実行できる必要がありました(tclはすべてのプラットフォームでスレッドのサポートが保証されていないほど古いものです)

mainloop()はメインラインに存在する必要がありますか?それをスレッド化/マルチプロセッシングできますか?

mainloop()は、ルートウィンドウを作成した同じスレッドで実行する必要があります。スレッドが必要な場合(また、スレッドが必要ない場合もあります)、イベントハンドラを別のスレッドで確実に実行できます。複雑さは増しますが、必要な場合はそこにあります。大規模なプログラムの場合、その複雑さは必要ありません。

ワーカースレッドを作成してそこからGUIを作成して実行できるはずです。私はそれを試したことはありませんが、それは動作しない理由はありません。 Tkinterはそれがメインスレッドであることに気付かず、すべてのtkinterコードが同じスレッドで実行されるだけです。

私が出会ったすべての例では、メインラインにmainloop()がありますが、これは推奨される方法であるか、何のメリットがあるかわかりません。

メインスレッドでmainloopを呼び出すのは、tkinterがどのように動作するように設計されたかです。長時間実行している計算の場合は、それらの計算を別のスレッドまたはプロセスに配置する必要があります。

+0

ステップバイステップの答えをありがとう、私は間違いなくスレッドやプロセスが必要です、私はあまりにも多くのI/Oと大きなデータ構造の卑猥な量があります。興味深いのは、他のヘルパーがここで引用した同様の質問に対するあなたの以前の回答では、スレッドモードではtkが適切に動作していないと言いました。しかし、あなたは今言っているようですが、それをするのは大丈夫です。 – YunliuStorage

関連する問題