Python3.6を使用してasyncioとtkinterを用いたコードを書きたいと思います。
しかし残念ながらこの二つは相性が悪く併用が難しいです。
dialog.py
python3
1from tkinter import filedialog, Tk, Frame 2import platform 3from pathlib import Path 4 5 6class Dialogs(Frame): 7 def __init__(self): 8 self.root = Tk() 9 super().__init__(self.root) 10 self.root.geometry("0x0") 11 self.root.overrideredirect(1) 12 self.root.withdraw() 13 self.system = platform.system() 14 self.pack() 15 16 def open_dialog(self, dialog_open_method=filedialog.askopenfilename, options=None): 17 if self.system == "Windows": 18 self.root.deiconify() 19 self.root.update() 20 self.root.lift() 21 self.root.focus_force() 22 path_str = dialog_open_method(**(options or {})) 23 self.root.update() 24 if self.system == "Windows": 25 self.root.withdraw() 26 return Path(path_str)
ダイアログを開きファイルを選択します。
main.py
python3
1from dialog import Dialogs 2import asyncio 3 4loop = asyncio.get_event_loop() 5dialog = Dialogs() 6 7 8async def looper(): 9 while True: 10 await asyncio.sleep(1) 11 print("loop!") 12 13 14async def main(): 15 asyncio.ensure_future(looper()) 16 path = dialogs.open_dialog() 17 print(path) 18 19 20if __name__ == "__main__": 21 loop.run_until_complete(main())
上記のコードはEventLoopをブロックしてしまいます。
通常はrun_in_executorを用いるところですがRuntimeError: main thread is not in main loop
とエラーを出されます。
どのようなコードを用いればEventLoopをブロックされずに済むのでしょうか?
回答の方を宜しくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/07 14:33
2019/07/08 01:52