#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, где он никогда не создавался.