Я хотел бы иметь кнопку matplotlib, которую можно использовать только один раз. В идеале я мог бы сделать это, отключив обратный вызов. Однако существует проблема синхронизации при отключении самого обратного вызова.
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
fig, ax = plt.subplots()
donebutton = Button(ax, "Disconnect the button")
def donecallback(event):
donebutton.disconnect(donecid)
print("Disconnected")
donecid = donebutton.on_clicked(donecallback)
plt.show()
Чтобы отключить обратный вызов, мне нужен его идентификатор обратного вызова, donecid
, который я получаю при подключении обратного вызова. Чтобы подключить обратный вызов, я сначала должен его определить, donecallback
. Чтобы определить обратный вызов, я должен уже знать CID. Поэтому я застрял с проблемой курицы и яйца.
Существуют обходные пути, такие как определение класса, чтобы я мог передавать данные в обратные вызовы через self
, имея глобальный флаг, который отслеживает была ли нажата кнопка или создается новая идентичная кнопка без подключенного обратного вызова. Однако было бы неплохо, если бы существовал способ попроще. Есть?
РЕДАКТИРОВАТЬ: Следующая ошибка возникает, когда я использую любой из указанных мной кодов. или код, предоставленный dnalow.
func(*args, **kwargs)
File "C:\Users\MyName\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\matplotlib\widgets.py", line 210, in _release
for cid, func in self.observers.items():
RuntimeError: dictionary changed size during iteration```