2009-05-19 6 views
0

Je travaille sur l'écriture d'une application client/serveur très simple comme excuse pour commencer à apprendre la programmation réseau/gui en python. En ce moment, je suis bloqué sur la transition de mon cadre de connexion à l'image principale de l'application.Fermeture et ouverture des trames dans wxPython

Le cadre de connexion est une sous-classe de wx.Frame, et fondamentalement, je veux juste fermer et ouvrir le châssis principal lorsqu'il reçoit la confirmation du serveur:

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) 

Je ne peux même pas ce pour donner un message d'erreur cohérente mais ... parfois ça marche, parfois, il tombe en panne avec les éléments suivants:

python: ../../src/xcb_io.c:242: process_responses: assertion `(((long) (dpy-> last_request_read) - (long) (dpy-> request)) < = 0) 'échoué.

Toute aide est très appréciée!

Walker

+0

Je n'ai pas fait de wxpython depuis longtemps mais que se passe-t-il si vous créez et affichez la fenêtre principale avant de fermer la fenêtre de connexion? – Ravi

+0

Même chose, cela fonctionne de temps en temps et se bloque aux 3/4 du temps. –

+0

Ce code réseau est-il exécuté sur un thread distinct ou sur le thread graphique? Vous pouvez uniquement faire des appels wx sur le thread graphique principal. – FogleBird

Répondre

1

je faire de votre cadre principal apparaît, puis montrent une boîte de dialogue de connexion modal au-dessus à la place.

Si vous ne voulez pas faire cela, je vous suggère de créer deux images séparées et de demander à votre application d'écouter un événement de fermeture sur le cadre de connexion. Gérer la connexion dans ce gestionnaire d'événements, puis l'afficher dans la fenêtre principale. Fondamentalement, vous ne voulez pas instancier la fenêtre principale dans votre gestionnaire d'événements puisqu'une fois que vous quittez la fonction, la portée est perdue, le garbage collector essaiera de supprimer votre cadre. Enfin, vous devriez appeler getCode() une fois et mettre en cache le résultat pour vos comparaisons. Depuis votre instruction if et déclaration elif à la fois appeler getCode() très bien peut donner des résultats différents.

+0

Merci, c'est définitivement une solution beaucoup plus propre. Appréciez-le! –

0

mainWindow est une variable locale de handleServerSignon. Ceci est une supposition, mais je pense que cela peut être collecté dès que la méthode handleServerSignon revient.

Questions connexes