回答編集履歴
2
補足: 質問文に nfc なしのケースについて言及があったので、説明の細部を補足。
    
        answer	
    CHANGED
    
    | @@ -23,7 +23,7 @@ | |
| 23 23 | 
             
            スレッドの使い方は修正した方が良いです。
         | 
| 24 24 |  | 
| 25 25 | 
             
            もし、影響が無かったとしたら、
         | 
| 26 | 
            -
            nfc なしで問題が発生するかどうかを試してみてください。
         | 
| 26 | 
            +
            nfc なし(補足: スレッドは使って)で問題が発生するかどうかを試してみてください。
         | 
| 27 27 |  | 
| 28 28 | 
             
            ----
         | 
| 29 29 | 
             
            ```python
         | 
1
関数がどのスレッドで実行されているのか、把握しやすいようにロギングを設定
    
        answer	
    CHANGED
    
    | @@ -29,20 +29,21 @@ | |
| 29 29 | 
             
            ```python
         | 
| 30 30 | 
             
            #!/usr/bin/env python3.8
         | 
| 31 31 |  | 
| 32 | 
            -
             | 
| 33 32 | 
             
            import tkinter as tk
         | 
| 34 33 | 
             
            from threading import Thread
         | 
| 34 | 
            +
            import logging
         | 
| 35 35 |  | 
| 36 | 
            -
             | 
| 37 36 | 
             
            def thread_main(root):
         | 
| 37 | 
            +
                logging.info("thread_main started")
         | 
| 38 | 
            +
                logging.info("Open Dialog")
         | 
| 38 | 
            -
                win = tk.Toplevel( | 
| 39 | 
            +
                win = tk.Toplevel()
         | 
| 39 40 | 
             
                win.geometry("100x100+100+100")
         | 
| 40 41 |  | 
| 41 | 
            -
             | 
| 42 42 | 
             
            def main():
         | 
| 43 43 | 
             
                root = tk.Tk()
         | 
| 44 44 |  | 
| 45 45 | 
             
                def start():
         | 
| 46 | 
            +
                    logging.info("Button clicked")
         | 
| 46 47 | 
             
                    thread = Thread(target=thread_main, args=(root,), daemon=True)
         | 
| 47 48 | 
             
                    thread.start()
         | 
| 48 49 |  | 
| @@ -50,6 +51,7 @@ | |
| 50 51 | 
             
                root.mainloop()
         | 
| 51 52 |  | 
| 52 53 | 
             
            if __name__ == '__main__':
         | 
| 54 | 
            +
                logging.basicConfig(level=logging.INFO, format="[%(threadName)s] %(message)s")
         | 
| 53 55 | 
             
                main()
         | 
| 54 56 | 
             
            ```
         | 
| 55 57 |  | 
| @@ -58,24 +60,24 @@ | |
| 58 60 | 
             
            ```python
         | 
| 59 61 | 
             
            #!/usr/bin/env python3.8
         | 
| 60 62 |  | 
| 61 | 
            -
             | 
| 62 63 | 
             
            import tkinter as tk
         | 
| 63 64 | 
             
            from threading import Thread
         | 
| 65 | 
            +
            import logging
         | 
| 64 66 |  | 
| 65 67 | 
             
            def open_dialog(root):
         | 
| 68 | 
            +
                logging.info("Open Dialog")
         | 
| 66 69 | 
             
                win = tk.Toplevel(root)
         | 
| 67 70 | 
             
                win.geometry("100x100+100+100")
         | 
| 68 71 |  | 
| 69 72 | 
             
            def thread_main(root):
         | 
| 70 | 
            -
                # これは有用なスレッドの利用例ではありませんが、
         | 
| 71 | 
            -
                 | 
| 73 | 
            +
                logging.info("thread_main started")
         | 
| 72 74 | 
             
                root.after_idle(open_dialog, root)
         | 
| 73 75 |  | 
| 74 | 
            -
             | 
| 75 76 | 
             
            def main():
         | 
| 76 77 | 
             
                root = tk.Tk()
         | 
| 77 78 |  | 
| 78 79 | 
             
                def start():
         | 
| 80 | 
            +
                    logging.info("Button clicked")
         | 
| 79 81 | 
             
                    thread = Thread(target=thread_main, args=(root,), daemon=True)
         | 
| 80 82 | 
             
                    thread.start()
         | 
| 81 83 |  | 
| @@ -83,5 +85,6 @@ | |
| 83 85 | 
             
                root.mainloop()
         | 
| 84 86 |  | 
| 85 87 | 
             
            if __name__ == '__main__':
         | 
| 88 | 
            +
                logging.basicConfig(level=logging.INFO, format="[%(threadName)s] %(message)s")
         | 
| 86 89 | 
             
                main()
         | 
| 87 90 | 
             
            ```
         | 
