Многопоточность Python не будет работать дважды, даже если она находится в цикле

#python #multithreading #tkinter

#python #многопоточность #tkinter

Вопрос:

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

 def computer_pressed(btn):
#the button are alredy deactivated
btn['underline'] = 1 #the btn is the button on the board which the computer wants to press
#the underline is a flag, meaning-press the button with underline=1

def wait(theBoard): #the threading
while True:
    for plate in theBoard:
        if theBoard[plate]['underline'] == 1:
            time.sleep(2) #the timer
            theBoard[plate].configure(text = COMPUTER, highlightbackground = "#c7eaeb",
                                      underline = -1) #presses the button
            activate_buttons(theBoard) #activates the button again
 

из main:

 x = threading.Thread(target=wait, args=(theBoard, )) #the board consists all buttons in board
x.start()
 

Все работает хорошо в первый раз, затем во второй:

 Exception in thread Thread-1:
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/name/Desktop/tic.py", line 107, in wait
    if theBoard[plate]['underline'] == 1:
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1643, in cget
    return self.tk.call(self._w, 'cget', '-'   key)
_tkinter.TclError: invalid command name ".!frame2.!button3"
 

Недопустимая команда? Почему это вообще недопустимая команда?

Спасибо всем за помощь

Комментарии:

1. Привет, кажется странным вызывать a для x в y, а затем вызывать y[x] [z] . Вы должны сделать «»if plate[‘underline’] == 1:»» вместо «»if theBoard [plate] [‘underline’] == 1:»» пример dataquest.io/blog/python-for-loop-tutorial

2. invalid command name ".!frame2.!button3" означает, что вы пытаетесь изменить виджет кнопки после того, как он был уничтожен, или в интерпретаторе tcl, где он никогда не создавался.