2017-01-10 3 views
0

У меня есть всплывающее окно с Kivy, которое содержит 2 кнопки. Пользователь может отклонить всплывающее окно, нажав за пределами области всплывающих окон (auto_dismiss = True) или нажав кнопку «Нет». Выбрав кнопку «Да», выйдет из всего приложения.Как отклонить всплывающее окно Kivy через кнопку?

Пожалуйста, смотрите соответствующий код:

class ExitApp(App): 

def exit_confirmation(self): 

    # popup can only have one Widget. This can be fixed by adding a BoxLayout 

    self.box_popup = BoxLayout(orientation = 'horizontal') 

    self.box_popup.add_widget(Label(text = "Really exit?")) 

    self.box_popup.add_widget(Button(
     text = "Yes", 
     on_press = ExitApp.exit, 
     size_hint = (0.215, 0.075))) 

    self.box_popup.add_widget(Button(
     text = "No", 
     on_press = self.popup_exit.dismiss, 
     size_hint=(0.215, 0.075))) 

    self.popup_exit = Popup(title = "Exit", 
     content = self.box_popup, 
     size_hint = (0.4, 0.4), 
     auto_dismiss = True) 

    self.popup_exit.open() 

def exit(self): 

    App.get_running_app().stop() 

Проблема теперь лежит с нажатием на кнопку «Нет». При нажатии этой клавиши код завершается с этой ошибкой:

on_press = self.popup_exit.dismiss, 

AttributeError: 'Button' object has no attribute 'popup_exit'

Любая идея, как я могу исправить это как можно проще?

ответ

1

Вы можете решить эту проблему с помощью функции ленивым

on_press = lambda *args: self.popup_exit.dismiss() 

Таким образом, поиск будет происходить только при нажатии на кнопку и popup_exit уже на месте ...

+0

Функция лямбда не помогла здесь ... Пожалуйста, см. Мой ответ без функции лямбда. Любая идея, как лямбда может быть использована тогда в этом примере? –

+0

@ElFred Положите строку из моего ответа вместо строки, которая терпит неудачу в вашей ... если она не работает, опубликуйте новую ошибку ... –

+0

Ваше предложение не с этой ошибкой: «TypeError: () не принимает аргументы (1 данный) " –

-1

Попробуйте это: on_press = self.popup.dismiss() в замене on_press = self.popup_exit.dismiss

+0

Неправильно, это будет называться во время оценки! –

+0

Почему? Меня устраивает? – tomdertech

0

Изменение on_press = self.popup_exit.dismiss в on_press = lambda: self.popup_exit.dismiss(), потому что уволить функция и должна вызываться при нажатии кнопки.

def exit_confirmation(self): 


    # popup can only have one Widget. This can be fixed by adding a BoxLayout 

    self.box_popup = BoxLayout(orientation = 'horizontal') 

    self.box_popup.add_widget(Label(text = "Really exit?")) 

    self.box_popup.add_widget(Button(
     text = "Yes", 
     on_press = ExitApp.exit, 
     size_hint = (0.215, 0.075))) 

    self.popup_exit = Popup(title = "Exit", 
     content = self.box_popup, 
     size_hint = (0.4, 0.4), 
     auto_dismiss = True) 

    self.box_popup.add_widget(Button(
    text = "No", 
    on_press = lambda: self.popup_exit.dismiss() , 
    size_hint=(0.215, 0.075))) 

    self.popup_exit.open() 
+1

Вы не должны называть self.popup_exit.dismiss(), он будет вызываться во время оценки! не когда кнопка нажата, удалите скобку –

+1

Теперь, когда вы используете * лямбда *, порядок определения не имеет значения ... –

+0

Думаю, мне нужно удалить ответ :)). Да, я снова отредактирую и подумаю, что :) tnx – Juggernaut

Смежные вопросы