2017-05-29 1 views
0


C'est mon premier message, donc si je fais quelque chose de mal, soyez patient.
Je travaille sur un programme de chat très simple écrit en python avec une interface gtk, un utilisateur a le serveur et l'autre a le client. Tout fonctionne, sauf que je ne peux pas envoyer ou recevoir de messages (bien que la connexion soit établie). J'ai déjà cherché une solution sur le forum mais je n'ai rien trouvé.
(partie) le code de l'interface graphique est:
Gdk-ERROR en mode Python avec Multithreading

gi.require_version ('Gtk', '3.0') 
from gi.repository import Gtk, Gdk, GObject, GLib 
class GUI: 
    def __init__ (self, is_server): 
     GObject.threads_init() 
     [...] 
     self.buffer1 = Gtk.TextBuffer() 
     self.text_box = Gtk.TextView (buffer=self.buffer1) 
     self.text_box.set_editable (False) 
     [...] 
     self.th = threading.Thread (target = self.receive) 
     self.th.daemon = True 
     self.th.start() 
     Gtk.main() 
    def receive (self): 
     while (True): 
      try: 
       msg = self.socket.receive_message() 
       if (msg != ""): self.insert_text (msg) 
      except: pass 
    def insert_text (self, text): 
     self.text_box.set_editable (True) 
     end_iter = self.buffer1.get_end_iter() 
     try: self.buffer1.insert (end_iter, text + "\n") 
     except: pass 
     self.text_box.set_editable (False) 
     adj = self.scr.get_vadjustment() 
     adj.set_value (adj.get_upper()) 

Et Client.py ou Server.py (sont les mêmes lignes):

class Client/Server: 
    [...] 
    def receive_message (self): 
     try: 
      msg0 = self.conn.recv (1024) 
      msg = msg0.decode ("utf-8") 
      return msg 
     except: pass 

L'erreur que je reçois est:

(Chat.py:61330): Gdk-ERROR **: The program 'Chat.py' received an X Window System error. 
This probably reflects a bug in the program. 
The error was 'BadRequest (invalid request code or no such operation)'. 
    (Details: rerial 892 error_code 1 request_code 0 (core protocol) minor_code 0) 
    (Note to programmers: normally, X errors are reported asynchronously; 
    that is, you will receive the error a while after causing it. 
    To debug your program, run it with the GDK_SYNCHRONIZE environment 
    variable to change this behavior. You can get a meaningful 
    backtrace from your debugger if you break on the gdk_x_error() function.) 
Trace/BPT trap (code dumped) 

Je pense qu'il est une erreur multithreading car dans le second fil que j'essaie de changer le texte du Gtk.TextView mais je ne suis pas sûr (je suis tout à fait nouveau avec mul tithreading).

Merci à tous.

Répondre

1

Vous ne pouvez pas appeler les fonctions GTK + à partir d'un thread autre que celui qui a appelé Gtk.main(). Vous devez modifier vos threads pour envoyer des données au thread principal et que cela modifie l'interface graphique à la place, par exemple en enveloppant l'appel à insert_text() dans dans un GLib.idle_add().

+0

Ça marche, merci beaucoup. – Momolo