Приложение Python Tkinter с использованием Threading аварийно завершает работу

avatar
Harxish
9 августа 2021 в 06:23
106
0
0

Я создал приложение tkinter, которое отображает штриховые графики в виде вкладок, используя ttk.Notebbok. Приложение содержит new button, когда он щелкает штриховой график, он запускается в новом daemon thread (потому что я хочу, чтобы мое приложение Tk запускалось) и открывает URL-адрес в tkinter, используя cef в новой вкладке.

Но проблема в том, что когда я нажимаю новую кнопку во время загрузки предыдущего графика, все вылетает. А это журнал ошибок.

Fatal Python error: PyEval_RestoreThread: the function must be called with the GIL held, but the GIL is released (the current Python thread state is NULL)

Python runtime state: initialized

Thread 0x00000518 (most recent call first):
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\dash\_watch.py", line 36 in watch
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\dash\dash.py", line 1419 in <lambda>
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\threading.py", line 892 in run
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\threading.py", line 954 in _bootstrap_inner
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\threading.py", line 912 in _bootstrap

Thread 0x000032d0 (most recent call first):
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\selectors.py", line 315 in _select
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\selectors.py", line 324 in select
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\socketserver.py", line 232 in serve_forever
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\werkzeug\serving.py", line 717 in serve_forever
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\werkzeug\serving.py", line 961 in inner
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\werkzeug\serving.py", line 1008 in run_simple
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 920 in run
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\site-packages\dash\dash.py", line 1699 in run_server
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\threading.py", line 892 in run
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\threading.py", line 954 in _bootstrap_inner
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\threading.py", line 912 in _bootstrap

Current thread 0x00000198 (most recent call first):
  File "c:\Throughput-Timing-Tool\UI\browser_screen.py", line 165 in message_loop_work
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 814 in callit
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892 in __call__
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1429 in mainloop
  File "c:\Throughput-Timing-Tool\UI\generate_screen.py", line 229 in generate_screen
  File "c:\Throughput-Timing-Tool\UI\webview.py", line 205 in generate
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892 in __call__
  File "C:\Users\hnagesw\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1429 in mainloop
  File "c:\Throughput-Timing-Tool\main_screen.py", line 24 in <module>
Источник
Matiiss
9 августа 2021 в 07:01
2

Вы не разместили свой код, но, насколько я узнал здесь, нельзя вызывать методы tkinter из других потоков, весь код tkinter должен содержаться в одном потоке, одном процессе, если вы хотите иметь потоки, тогда решение состоит в том, чтобы иметь поток, который помещает информацию в очередь, и иметь цикл .after, который получает из очереди и затем обновляет соответствующие виджеты tkinter, но опять же, было бы здорово увидеть ваш код, поэтому, пожалуйста, предоставьте минимальный воспроизводимый пример

Ответы (0)