Kivy:如何在 class 之外更新 bool

Kivy: how to update a bool outside class

当我点击和关闭复选框时,bool 当前会更新,但是当我点击按钮时,它将始终打印我在开始时定义的默认值。如何更新 class 之外的布尔值,以便在我单击按钮并调用函数时更新布尔值?

此外,单击 class 之外的按钮时如何调用这样的函数?

谢谢

someBool = False


def someFunction():
    print(someBool)



class MyGridLayout(GridLayout):
    def __init__(self, **kwargs):
        #grid layout constructor
        super(MyGridLayout, self).__init__(**kwargs)

        #set columns for the layout
        self.cols = 2

        self.add_widget(Label(text="checkbox"))
        self.checkbox= CheckBox(active = False)
        self.add_widget(self.checkbox)

        #this will bind the label and checkbox
        self.checkbox.bind(active = self.checkboxActive)

        self.button= Button(text="Button")
        self.button.bind(on_press=someFunction)
        self.add_widget(self.button)

    def checkboxActive(self, checkbox, value):
        if value:
            someBool = True
        else:
            someBool = False


class MyApp(App):
    def build(self):
        return MyGridLayout()


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

如果您想在 python 中的函数外部更改值,您必须指定其范围。使用 global variable.

可以轻松完成

然后对于按钮,你必须将一个匿名函数传递给 kivy on_press 方法,将它链接到你想要的函数。这样,新闻将触发传递的功能。所以我们必须为此使用 lambda

试试这个代码:

someBool = False


def someFunction():
    global someBool

    print(someBool)


class MyGridLayout(GridLayout):
    def __init__(self, **kwargs):
        # grid layout constructor
        super(MyGridLayout, self).__init__(**kwargs)

        # set columns for the layout
        self.cols = 2

        self.add_widget(Label(text="checkbox"))
        self.checkbox = CheckBox(active=False)
        self.add_widget(self.checkbox)

        # this will bind the label and checkbox
        self.checkbox.bind(active=self.checkboxActive)

        self.button = Button(text="Button")
        self.button.bind(on_press=lambda x: someFunction())
        self.add_widget(self.button)

    def checkboxActive(self, checkbox, value):
        global someBool

        if value:
            someBool = True
        else:
            someBool = False


class MyApp(App):
    def build(self):
        return MyGridLayout()


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