клиентское приложение Pygtk

Я хочу создать клиентский интерфейс в pygtk для своего проекта Django. Моя общая идея состоит в том, чтобы иметь одно главное окно, и каждый раз, когда у пользователя есть действие, которое должно изменить экран, чтобы выгрузить предыдущие виджеты и загрузить новые. Например, если у меня есть страница входа в систему, после входа пользователя ему предоставляется экран клиента. Я хочу, чтобы новый экран был размещен в том же главном окне, что-то вроде стека страниц, но без функции «назад». Моя первая мысль состояла в том, чтобы создать функцию для каждого экрана, show_login, show_customers_screen и т. д. Это хороший выбор или я должен попробовать лучший. И второй вопрос, связанный с первым. Могу ли я создавать обратные вызовы внутри функции?

e.g

This would be a method of MainWindow
def create_login(self):
    ....creating widgets here
    #UnboundLocalError: local variable 'clear_clb' referenced before assignment
    btnlogin.connect('clicked', clear_clb, data=None)


    def clear_clb(widget, data=None):
          ..log in process

Я знаю, почему я получаю ошибку. Дело в том, что поля, которые я хочу, чтобы эта функция очищала, являются локальными в create_login. Это правильный подход?


person Apostolos    schedule 17.10.2013    source источник


Ответы (1)


Определите символ clear_clb, прежде чем ссылаться на него:

def create_login(self):
    # create widgets
    def clear_clb(widget, data=None):
        # log in process
    btnlogin.connect('clicked', clear_clb, data=None)

Однако более обычный и, на мой взгляд, более читаемый способ сделать это — сохранить ссылки на ваши виджеты как атрибуты self:

def create_login(self):
    # create widgets
    self.btnlogin = gtk.Button(...
    self.btnlogin.connect('clicked', clear_clb)

def clear_clb(self, widget, data=None):
    # log in process
person ptomato    schedule 18.10.2013
comment
поэтому я должен сделать все экраны и их дочерние виджеты свойствами MainWindows, чтобы достичь того, чего я хочу? - person Apostolos; 18.10.2013
comment
Все виджеты, которые вы планируете использовать позже, да. Вы можете использовать верхний метод, если не хотите этого делать. - person ptomato; 19.10.2013