Моя цель
В моем приложении Kivy для Android у меня есть виджет «Переключатель», который при подключении создает соединение через разъем Bluetooth.При выключении закрывает сокет.Обратный вызов выполняется с параметром on_active.
Идея состоит в том, что при включении обратный вызов проверяет, было ли установлено соединение.Если да, то переключатель меняет свое значение.Если нет, появляется всплывающее окно, и переключатель возвращается к значению «active = False».
Моя проблема в том, что я не могу предотвратить изменение виджета Switch на «Active = True», когдаСоединение Bluetooth не установлено.
Вопрос : возможно ли предотвратить изменение статуса «Активный» внутри обратного вызова «on_active»?
Я смотрел вдокументация и много других примеров в интернете, но безуспешно.Я новичок в kivy / python, и любая помощь будет высоко ценится.
Уже пробовал
Я пытался связать свойство active с переменной приложенияпетля.Этот подход работает с другими кнопками, но при вызове в обратном вызове on_active активное состояние не изменяется.Кажется, что значение связанной переменной не обновляется (от False до True), пока обратный вызов не будет завершен.Поэтому я не могу использовать этот подход, потому что "app.activeSwitch = False" позже отменяется действием обратного вызова
Другой подход, который я также попытался, - передать указательПереключатель "(я думаю, называется указателем) для обратного вызова, а затем изменить статус через него.При таком подходе происходит сбой приложения.
Я думал об использовании Clock.schedule_once с таймером или перед следующим кадром, но это плохое решение.
Моей последней мыслью было попытаться прервать обратный вызов или использовать «return False», но это не сработало.
Основы кода
Kv File
<ClassName>:
BoxLayout:
Switch:
on_active: app.setBluetoothConnection(self.active)
active: app.activeBluetooth
Файл Python:
class MainLoop(App):
activeBluetooth=BooleanProperty(False)
#Here comes build with other Widget building and callbacks
def setBluetoothConnection(self,activeValue):
if activeValue == True:
try:
#Check whether we can connect and stablish connection
except:
#Error-Popup
popup = Popup(content=content, title='Connection,error',size_hint=(None, None), size=(300, 300))
popup.open()
#What can I define here to prevent the active status change of the switch?#
else:
#Close the socket connection and other stuff
Подводя итог
Я думаю, что должно быть очень простое решение этой проблемы без изменения большого количествачасти кода ...
Любая помощь или предложение очень приветствуется.
ОБНОВЛЕНИЕ К вопросу
Благодаря предложению / совету @John Anderson, у меня естьвыяснил, что делает мою программу сбой.Ниже приведено решение проблемы, но все же это не очень элегантное решение :
- Проблема : при определении activeSwitch.active=False
в пределах on_active callback , программа снова вызвала обратный вызов.Поскольку переменная socket соединения bluetooth не существует, когда нет соединения, я вызывал несуществующую переменную.
Обходное решение
Файл kv
<ClassName>:
BoxLayout:
Switch:
on_active: app.setBluetoothConnection(self)
active: False
Файл Python:
class MainLoop(App):
#Here comes build with other Widget building and callbacks
def setBluetoothConnection(self,activeSwitch):
if activeSwitch.active == True:
try:
self.recv_stream, self.send_stream, self.socket = get_socket_stream('connectionBluetooth') #DIALOG-SPS
except:
#Error-Popup
popup = Popup(content=content, title='Connection,error',size_hint=(None, None), size=(300, 300))
popup.open()
activeSwitch.active=False
else:
try:
self.socket.close() #close the socket connection
except:
pass
Следующий код является обходным решением проблемы, но он неоптимален, поскольку обратный вызов вызывается дважды при if activeSwitch.active == True
и except:
введено.
Чтобы знать, было бы здорово, если бы кто-то нашел более элегантное решение.