多个 python kivy Switch widgets with loop - 但只有一个可以是 activated/deactivated

multiple python kivy Switch widgets with loop - but only one can be activated/deactivated

我想用多个 Switch 小部件制作一个 python kivy gui。

问题是,当我 运行 我的代码时,只有 Switch 个小部件 (my switch 3) 中的一个可以工作。具体来说,我可以毫无问题地打开和关闭 my switch 3,但是如果我尝试打开 my switch 2my switch 1,则没有任何反应。

感谢您的帮助!

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.switch import Switch

class SwitchClass(FloatLayout):
    def __init__(self, **kwargs):
        super(SwitchClass, self).__init__(**kwargs)
        self.size=(600, 200)
        switch_widgets = [('my switch 1', switch1_callback), 
                      ('my switch 2', switch2_callback), 
                      ('my switch 3', switch3_callback)] 
        for increment, switch_widget in enumerate(switch_widgets):   
            self.add_widget(Label(text = switch_widget[0], pos=(25, increment*50+50)))              
            self.settings_sample = Switch(active = False, pos=(125, increment*50+50))               
            self.add_widget(self.settings_sample)                   
            self.settings_sample.bind(active = switch_widget[1])   
                
def switch1_callback(switchObject, switchValue):
    pass 

def switch2_callback(switchObject, switchValue):
    pass 

def switch3_callback(switchObject, switchValue):
    pass 
        
class SwitchApp(App):
    def build(self):
        return SwitchClass()  

if __name__ == '__main__':
     SwitchApp().run()

问题是每个 LabelSwitch 小部件的默认 size_hint of (1,1) 意味着它们都填满了整个 SwitchClass.所以最后添加的 Switch ('my switch 3'),首先获得鼠标点击并在不允许其他 Switch 小部件机会的情况下声明它。要修复它,只需为这些小部件指定一个大小,如下所示:

class SwitchClass(FloatLayout):
    def __init__(self, **kwargs):
        super(SwitchClass, self).__init__(**kwargs)
        self.size = (600, 200)
        switch_widgets = [('my switch 1', switch1_callback),
                          ('my switch 2', switch2_callback),
                          ('my switch 3', switch3_callback)]
        for increment, switch_widget in enumerate(switch_widgets):
            print(increment, switch_widget)

            # provide sizes for the widgets:
            self.add_widget(Label(text=switch_widget[0], pos=(25, increment * 50 + 50), size_hint=(None, None), size=(100, 50)))
            self.settings_sample = Switch(active=False, pos=(125, increment * 50 + 50), size_hint=(None, None), size=(100, 50))

            self.add_widget(self.settings_sample)
            self.settings_sample.bind(active=switch_widget[1])