2009-05-19 3 views
0

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

Войти кадр является подклассом 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) 

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

питона: ../../src/xcb_io.c:242: process_responses: Утверждающие `(((длинный) (dpy-> last_request_read) - (длинный) (d py-> request)) < = 0).

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

Walker

+0

Я не проработал какое-нибудь wxpython, но что произойдет, если вы создадите и покажете главное окно перед закрытием окна входа? – Ravi

+0

То же самое, он работает каждый раз в то время и падает 3/4 или около того времени. – 2009-05-20 00:15:43

+0

Этот сетевой код работает в отдельном потоке или потоке графического интерфейса? Вы можете делать только wx-вызовы в главном потоке графического интерфейса. – FogleBird

ответ

1

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

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

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

+0

Спасибо, это определенно намного более чистое решение. Ценить это! – 2009-05-22 06:00:20

0

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

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