Kivy всплывающее окно в python с несколькими действиями on_release на кнопку - PullRequest
0 голосов
/ 04 марта 2020

Недавно я изменил свой код, потому что мой GUI стал слишком сложным, и я хотел закодировать мои всплывающие окна в python, в то время как другие мои элементы GUI создаются в отдельном файле kivy. Из kivy я вызываю всплывающее окно с кнопки и события on_release:

Button:
    on_release:
        root.confirmPopup()

В python у меня есть следующее определение (не обращайте внимания на отступ):

    def confirmPopup(self): #call from kivy-file with root.confirmPopup()
        #create popup
        self.confPop = Popup()
        self.confPop.title = 'Confirm Action'
        self.confPop.auto_dismiss = False
        self.confPop.size_hint =  (None, None)
        self.confPop.size = (400, 300)
        #create popup-content
        # def confAct():
        #     lambda *args: self.confPop.dismiss()
        #     print('test')

        confBox = BoxLayout()
        confBox.orientation = 'vertical'
        confBox.add_widget(Label(text='Please confirm your action!',
                             pos_hint = {'center_x': .5, 'center_y': .5},
                             halign='center'))
        confBox.add_widget(Button(text='Accept'))
        confBox.add_widget(Button(text='Cancel',
                           on_release=lambda *args: self.confPop.dismiss()))
                           #on_release=confAct()))
        #add content, open popup
        self.confPop.content = confBox
        self.confPop.open()

Как вы Можно видеть, что я пытался создать внутреннюю функцию, которую я прокомментировал, поскольку она не работала должным образом. Мой вопрос: как мне добавить несколько действий к on_release? Я мог бы добавить одно действие к on_press и одно к on_release, но это не то, что я хочу. Я пытался привязать несколько событий on_release к кнопке, разделяя команды с помощью; и так далее, но ничего не получалось. В kivy я мог бы просто добавить новую строку с отступом для каждой команды после on_release.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Понял, мне потребовался дополнительный lambda *args: перед моим внутренним вызовом функции. Полный код:

    def confirmPopup(self): #call from kivy-file with root.confirmPopup()
        #create popup
        self.confPop = Popup()
        self.confPop.title = 'Confirm Action'
        self.confPop.auto_dismiss = False
        self.confPop.size_hint =  (None, None)
        self.confPop.size = (250, 250)
        #create popup-content      
        confBox = BoxLayout()
        confBox.orientation = 'vertical'
        confBox.spacing = 5
        confBox.padding = (30,30,30,30)
        confBox.add_widget(Label(text='Please confirm your action!',
                              pos_hint = {'center_x': .5, 'center_y': .5},
                              halign='center'))
        confBox.add_widget(Button(text='Accept',
                                  size_hint=(1,0.5),
                                  on_release=lambda *args: confAcc()))
        confBox.add_widget(Button(text='Cancel',
                                  size_hint=(1, 0.5),
                                  on_release=lambda *args: self.confPop.dismiss()))
        #inner function
        def confAcc():
            self.confPop.dismiss()
            print('miau')
        #add content, open popup
        self.confPop.content = confBox
        self.confPop.open()

Возможно, это не лучшее решение, но оно работает. Звонок из киви-файла остается прежним:

Button:
    on_release:
        root.confirmPopup()
0 голосов
/ 04 марта 2020

Вы не можете установить несколько функций on_release (или on_press). Но почему бы вам просто не создать функцию, которая вызывает другие нужные вам функции, и вызывать ее по кнопке?

Button(..., on_release=function)

def function():
    function2()
    function3()
    function4()
    ...
...