Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 防止on_活动回调中的活动状态更改 我的目标_Android_Python_Switch Statement_Widget_Kivy - Fatal编程技术网

Android 防止on_活动回调中的活动状态更改 我的目标

Android 防止on_活动回调中的活动状态更改 我的目标,android,python,switch-statement,widget,kivy,Android,Python,Switch Statement,Widget,Kivy,在我的Android版Kivy应用程序中,我有一个开关小部件,当它打开时可以创建蓝牙套接字连接。关闭时,它将关闭插座。使用on_active选项执行回调 其思想是,当打开时,回调将检查连接是否已建立。如果是,则开关会更改其值。如果否,将出现一个弹出窗口,开关返回到“active=False”值 我的问题是,当蓝牙连接未建立时,我无法阻止交换机小部件更改为“Active=True” 问题:是否可以防止在“on_Active”回调中更改“Active”状态 我查阅了文档和互联网上的许多其他示例,但没

在我的Android版Kivy应用程序中,我有一个开关小部件,当它打开时可以创建蓝牙套接字连接。关闭时,它将关闭插座。使用on_active选项执行回调

其思想是,当打开时,回调将检查连接是否已建立。如果是,则开关会更改其值。如果否,将出现一个弹出窗口,开关返回到“active=False”值

我的问题是,当蓝牙连接未建立时,我无法阻止交换机小部件更改为“Active=True”

问题:是否可以防止在“on_Active”回调中更改“Active”状态

我查阅了文档和互联网上的许多其他示例,但没有成功。我是kivy/python的新手,非常感谢您的帮助

已经试过了
  • 我已尝试将active属性绑定到应用程序循环的变量。这种方法适用于其他按钮,但在“on_active”回调中调用时,活动状态不会改变。 在回调完成之前,绑定的变量值似乎不会更新(从False到True)。因此,我不能使用这种方法,因为“app.activeSwitch=False”稍后会被回调操作推翻

  • 我也尝试过的另一种方法是将“开关指针”(我认为称为指针)传递给回调,然后通过它更改状态。应用程序使用这种方法崩溃

  • 我曾经考虑过在下一帧之前或在计时器上使用Clock.schedule_,但这是一个糟糕的解决方案

  • 我最后的想法是尝试中断回调或使用“return False”,但它不起作用

  • 代码基础 Kv文件

        <ClassName>:
            BoxLayout:
              Switch:
                 on_active: app.setBluetoothConnection(self.active)
                  active: app.activeBluetooth
    
    总结 我认为必须有一个非常简单的解决方案来解决这个问题,而不需要改变代码的很多部分

    非常感谢您的任何帮助或建议

    问题的最新情况 多亏了@johnanderson的建议/提示,我已经弄明白是什么让我的程序崩溃了。以下是该问题的解决方案,但仍然不是一个非常优雅的解决方案:

    -问题:在
    活动回调中定义
    activeSwitch.active=False
    时,程序再次调用回调。由于蓝牙连接的套接字变量在没有连接时不存在,所以我调用了一个不存在的变量

    解决方案 kv文件

      <ClassName>:
            BoxLayout:
              Switch:
                 on_active: app.setBluetoothConnection(self)
                  active: False
    
    下面的代码是解决此问题的一种方法,但它不是最优的,因为当
    if activeSwitch.active==True
    输入时,回调被调用两次


    如果有人能想出一个更优雅的解决方案,那就太好了。

    我刚刚意识到我认为是你的问题。
    setBluetoothConnection()
    中的
    else
    语句作为
    try的一部分,else
    块除外。我认为您打算将
    else
    if
    匹配。因此,您需要取消对
    else
    块的登入。将
    开关
    实例传递给
    setBluetoothConnection()
    而不仅仅是
    活动
    值将简化代码:

    kv

    <ClassName>:
        BoxLayout:
          Switch:
             # pass the Switch instance to the setBluetoothConnection() method
             on_active: app.setBluetoothConnection(self)
             active: False
    

    我刚意识到我认为是你的问题。
    setBluetoothConnection()
    中的
    else
    语句作为
    try的一部分,else
    块除外。我认为您打算将
    else
    if
    匹配。因此,您需要取消对
    else
    块的登入。将
    开关
    实例传递给
    setBluetoothConnection()
    而不仅仅是
    活动
    值将简化代码:

    kv

    <ClassName>:
        BoxLayout:
          Switch:
             # pass the Switch instance to the setBluetoothConnection() method
             on_active: app.setBluetoothConnection(self)
             active: False
    

    activeBluetooth
    属性在您的
    App
    类中的用途是什么?除非您采取措施进行更改,否则
    开关的状态不会更改。它不会自动切换回“真”“.Hi@John Anderson:
    activeBluetooth
    只是一个试验的一部分,以防止交换机在蓝牙连接未建立时更改值。我可以摆脱它。2点:这个想法是为了防止在未建立蓝牙连接时将活动状态更改为活动状态。也就是说,开关返回到active=False,以防止活动回调中的状态更改。(很抱歉格式化,我一直在玩,无法再次编辑评论)您在
    kv
    文件
    active:app.activeBluetooth
    中的行设置了
    Switch
    active
    属性和
    MainLoop
    activeBluetooth
    属性之间的绑定。该绑定将调整
    开关的
    active
    属性,使其与
    activeBluetooth
    属性一致。我认为最好不要使用该属性和绑定。您的
    应用程序
    类中的
    activeBluetooth
    属性的用途是什么?除非您采取措施进行更改,否则
    开关的状态不会更改。它不会自动切换回“真”“.Hi@John Anderson:
    activeBluetooth
    只是一个试验的一部分,以防止交换机在蓝牙连接未建立时更改值。我可以摆脱它。2点:这个想法是为了防止在未建立蓝牙连接时将活动状态更改为活动状态。也就是说,开关返回到active=False,以防止活动回调中的状态更改。(很抱歉格式化,我一直在玩,无法再次编辑评论)您在
    kv
    <ClassName>:
        BoxLayout:
          Switch:
             # pass the Switch instance to the setBluetoothConnection() method
             on_active: app.setBluetoothConnection(self)
             active: False
    
     class MainLoop(App):
        #Here comes build with other Widget building and callbacks
    
        def setBluetoothConnection(self,switch_instance):
          if switch_instance.active == 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?#
    
           # note the indentation matches the above `if` statement
           else:
                #Close the socket connection and other stuff
                switch_instance.active = False