Bonjour à tous,
Je planche sur un grand programme qui travaille avec IRC sans aucun module pré-conçu. Mais ce n'est pas cette partie qui pose problème mais la partie graphique.
Mon application est faite de deux threads: le principal qui fait tourner le MainLoop de mon interface et l'autre qui gère la connexion IRC. Dès qu'un message privé arrive je dois ouvrir une fenêtre contenant le message avec le pseudo de la personne.
Cependant, la création de la fenêtre fonctionne sauf que elle est bloquée/gelée (sablier et "ne répond pas"). Par contre les autres fenêtres ne sont pas bloquées, elles fonctionnent et les autres évenements attaché à IRC continue de fonctionner correctement. D'après moi le problème vient du thread car mes autres fenêtres sont créées directement dans mon wx.Frame, de plus j'ai créé le script sans thread et ça fonctionne.
J'ai réussi à reproduire ceci dans un petit exemple:
Comment feriez vous à ma place ? Surtout qu'il faut imaginer un programme beaucoup plus complexe dans Launch() car c'est là que dans mon programme je traite tous les messages IRC (les pings notamment etc...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 import wx import threading from time import sleep class Bonjour(wx.Frame): def __init__(self, titre): wx.Frame.__init__(self, None, -1, title = titre, size = (200, 100)) self.conteneur = wx.Panel(self, -1, size = self.GetClientSize()) self.etiquette = wx.StaticText(self.conteneur, -1, "Bonjour tout le monde !", style = wx.ALIGN_CENTRE) self.etiquette.CentreOnParent() wx.EVT_SIZE(self, self.OnSize) def OnSize(self, evt): self.SetTitle("Exemple %s" % evt.GetSize()) self.conteneur.SetSize(self.GetClientSize()) self.etiquette.CentreOnParent() class MonApp(wx.App): def OnInit(self): #fen2 = Bonjour("Exemple 3") #fen2.Show(True) #self.SetTopWindow(fen2) (threading.Thread(None, Launch, None, (), {'frame':self})).start() return True def Launch(frame): i=0 while (True): if (i == 10): #Lorsqu'un message arrive fen = Bonjour("Exemple 1") fen.Show(True) frame.SetTopWindow(fen) i+=1 app = MonApp() app.MainLoop()
J'ai failli oublier: L'appel de la fenêtre est faite dans une boucle while comme ici, est-ce que cela peut venir de ça ?
Merci d'avance et bonne journée
Partager