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()
GUIスレッドで長いジョブを実行すると、GUIがフリーズします。これを避けるには、ジョブごとに異なるスレッドを生成します。面白い質問; – ForceBru
;私は約10小さなと1つの平均サイズのアプリを書きました(Qtではない)応答性のアイデアを決して持っていなかったし、TkはGUIのです:)私は一般的には、私のGUIアプリケーションのためにKivyを使用するように移動したことで、Tkよりも柔軟性があり、必要に応じてAndroidやiosでうまく動作することをお勧めします。 – Drako
私はスレッド化を使用することを恐れ、マルチプロセスは避けられません。しかし、私の最初のサブ質問では、私が "割り込み"をベースにしたgui(Javaアプレットの当時)について学んだことがあったのですが、私は決してguiを止めず、間違った印象でした。 – YunliuStorage