Доступ к возвращаемому значению функции, переданной непосредственно в другую в Python - PullRequest
2 голосов
/ 08 декабря 2011

Я тестирую простой пример приложения PyGTK на основе кода в другом вопросе SO: Как установить кнопку по умолчанию в PyGTK? .

Однако я пытаюсьвыяснить, как получить доступ к значению, которое возвращает функция run ().Я знаю, что он передается в button.connect (), а другие аргументы передаются в run () при его вызове, но поскольку функция вызывается последней, я не знаю, как получить доступ к возвращаемому значению.

def foo():
    def run(button, window, entry):
        try: snooze_time = int(entry.get_text())
        except ValueError: snooze_time = 5

        snooze_confirm_message = 'Snoozing for ' + str(snooze_time) + ' minutes'

        dialog = gtk.MessageDialog(window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, snooze_confirm_message)
        dialog.run()
        dialog.destroy()
        return snooze_time

    snooze_time = None #Defaults to None
    window = gtk.Window()
    window.connect("destroy", gtk.main_quit)

    vbox = gtk.VBox(spacing = 40)
    snooze_time_entry = gtk.Entry()
    vbox.pack_start(snooze_time_entry)

    button = gtk.Button(stock = gtk.STOCK_SAVE)

    #Here the function is being passed to the button, though it is not called until later.
    button.connect("clicked", run, window, snooze_time_entry)
    button.set_flags(gtk.CAN_DEFAULT)
    window.set_default(button)
    vbox.pack_start(button)

    window.add(vbox)
    window.show_all()
    gtk.main()

    print("the result is " + str(snooze_time))

Если есть обходной путь, который более идиоматичен с PyGTK, он был бы здесь полезен, хотя мне также было бы интересно узнать более общий подход Python к этому.

1 Ответ

2 голосов
/ 08 декабря 2011

Вы должны использовать класс. Примерно так (это не полный код):

class Demo:
    def __init__(self):
       self.__snooze_time = None
       self.window = gtk.Window()
       self.window.connect("destroy", gtk.main_quit)
       self.button = gtk.Button(stock = gtk.STOCK_SAVE)

       self.button.connect("clicked", self.run, window, snooze_time_entry)
    def run(self, widget, event, data):
       try: 
          self.__snooze_time = int(data.get_text()) 
       except ValueError: 
          snooze_time = 5
...