Bool в настоящее время обновляется, когда я нажимаю и снимаю флажок, однако, когда я нажимаю кнопку, он всегда будет печатать значение по умолчанию, которое я определил в начале. Как я могу обновить логическое значение, находящееся вне класса, чтобы при нажатии кнопки и вызове функции оно обновляло логическое значение?
Кроме того, как я могу вызвать такую функцию при нажатии кнопки, которая находится вне класса?
Спасибо
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()