Я создаю графический интерфейс tkinter, и мне нужно сделать это потоком. Но нить не работает - PullRequest
0 голосов
/ 12 ноября 2018

Я создаю AI китайских шашек. Я хочу сделать доску и проверить положение мыши. Я решил использовать многопоточность:

from tkinter import *
from pyautogui import *
from threading import *

def create_board():
    #a lot of tkinter stuff
def check_mouse:
    if position()[0] > 390 & position()[0] < 455:
        print("mouse detected")

board = Thread(target=create_board)

board.start()

Но когда я запускаю его в терминале, я получаю:

2018-11-11 16:50:55.129 python[27074:8053445] WARNING: NSWindow drag regions should only be invalidated on the Main Thread! This will throw an exception in the future. Called from (
    0   AppKit                              0x00007fff44af22e3 -[NSWindow(NSWindow_Theme) _postWindowNeedsToResetDragMarginsUnlessPostingDisabled] + 386
    1   AppKit                              0x00007fff44aef68c -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 1488
    2   AppKit                              0x00007fff44aef0b6 -[NSWindow initWithContentRect:styleMask:backing:defer:] + 45
    3   libtk8.6.dylib                      0x0000000101319426 TkMacOSXMakeRealWindowExist + 742
    4   libtk8.6.dylib                      0x0000000101318ffc TkWmMapWindow + 60
    5   libtk8.6.dylib                      0x0000000101261930 Tk_MapWindow + 192
    6   libtk8.6.dylib                      0x000000010126b541 MapFrame + 65
    7   libtcl8.6.dylib                     0x000000010119cc71 TclServiceIdle + 161
    8   libtcl8.6.dylib                     0x000000010117a39d Tcl_DoOneEvent + 397
    9   _tkinter.cpython-37m-darwin.so      0x000000010108a88e _tkinter_tkapp_mainloop + 286
    10  python                              0x000000010098eba6 _PyMethodDef_RawFastCallKeywords + 230
    11  python                              0x000000010099bae4 _PyMethodDescr_FastCallKeywords + 84
    12  python                              0x0000000100acf32e call_function + 382
    13  python                              0x0000000100accd19 _PyEval_EvalFrameDefault + 45065
    14  python                              0x0000000100ac0a42 _PyEval_EvalCodeWithName + 418
    15  python                              0x000000010098ea73 _PyFunction_FastCallKeywords + 195
    16  python                              0x0000000100acf265 call_function + 181
    17  python                              0x0000000100accdaf _PyEval_EvalFrameDefault + 45215
    18  python                              0x000000010098e368 function_code_fastcall + 120
    19  python                              0x0000000100acd1c6 _PyEval_EvalFrameDefault + 46262
    20  python                              0x000000010098e368 function_code_fastcall + 120
    21  python                              0x0000000100acf265 call_function + 181
    22  python                              0x0000000100accd19 _PyEval_EvalFrameDefault + 45065
    23  python                              0x000000010098e368 function_code_fastcall + 120
    24  python                              0x0000000100acf265 call_function + 181
    25  python                              0x0000000100accd19 _PyEval_EvalFrameDefault + 45065
    26  python                              0x000000010098e368 function_code_fastcall + 120
    27  python                              0x0000000100991782 method_call + 130
    28  python                              0x000000010098f1e2 PyObject_Call + 130
    29  python                              0x0000000100baf5cb t_bootstrap + 123
    30  libsystem_pthread.dylib             0x00007fff747a133d _pthread_body + 126
    31  libsystem_pthread.dylib             0x00007fff747a42a7 _pthread_start + 70
    32  libsystem_pthread.dylib             0x00007fff747a0425 thread_start + 13
)

Что случилось? Что-то не так с окном tkinter?

1 Ответ

0 голосов
/ 12 ноября 2018

Tkinter (как и почти все известные мне графические структуры) требует, чтобы изменения состояния GUI происходили в определенном потоке. См. этот вопрос для дальнейшего обсуждения почему. Это не означает, что не может быть каких-либо других потоков в вашем приложении, просто вы не можете изменять состояние графического интерфейса пользователя из этих других потоков.

Если вы должны использовать другие потоки, чтобы длительные задачи не блокировали поток, используемый для графического интерфейса, вы можете иметь рабочие потоки, которые взаимодействуют с основным потоком через Queue, как описано здесь .

Я не могу предупредить, что многопоточность умножит сложность вашего приложения в 10 раз (особенно если вы новичок в таких понятиях, как Queue s). Однако, если вы не знакомы с Queue s и их типичным использованием в параллельном программировании и по-прежнему хотите начать, хорошее начало - шаблон производитель / потребитель . Для еще более основательного взгляда на то, что означает понятие «очередь» в comp-sci, вы можете взглянуть на эту страницу , которая описывает очередь и предлагает вам реализовать ее собственную простую версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...