Закрытие и открытие фреймов в wxPython - PullRequest
0 голосов
/ 20 мая 2009

Я работаю над написанием очень простого клиент-серверного приложения в качестве предлога для начала изучения сетевого / графического программирования на python. В данный момент я застрял при переходе от моего фрейма входа в систему к основному фрейму приложения.

Фрейм входа в систему является подклассом wx.Frame, и в основном я просто хочу закрыть его и открыть основной фрейм при получении подтверждения от сервера:

def handleServerSignon(self, msg):
    if msg.getCode() == net.message.HANDLE_IN_USE:
        self.status.SetStatusText('Handle already in use')
    elif msg.getCode() == net.message.SIGNON_SUCCESSFUL:
        self.Close()
        mainWindow = wx.Frame(None, wx.ID_ANY, 'main window', wx.DefaultPosition, \
                              (640, 480))

        mainWindow.Show(True)

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

python: ../../src/xcb_io.c:242: process_responses: утверждение `(((long) (dpy-> last_request_read) - (длинный) (dpy-> request)) <= 0) 'не удалось. </p>

Любая помощь очень ценится!

Walker

Ответы [ 2 ]

1 голос
/ 20 мая 2009

Я бы сделал так, чтобы ваш главный фрейм появлялся, а затем вместо этого показывал бы модальное диалоговое окно входа в систему.

Если вы не хотите этого делать, я предлагаю вам создать два отдельных фрейма и заставить ваше приложение прослушивать событие закрытия в фрейме входа в систему. Обработайте логин в этом обработчике событий, а затем покажите главное окно. По сути, вы не хотите создавать экземпляр главного окна в своем обработчике событий, поскольку после выхода из функции область действия теряется, сборщик мусора попытается удалить ваш фрейм.

Наконец, вы должны рассмотреть возможность вызова getCode() один раз и кэшировать результат для ваших сравнений. Поскольку ваши операторы if и оператор elif оба вызывают getCode(), вполне возможно, что они дают разные результаты.

0 голосов
/ 20 мая 2009

mainWindow является локальной переменной handleServerSignon. Это предположение, но я думаю, что это может быть сбор мусора, как только вернется метод handleServerSignon.

...