TypeError: expected string or buffer

bonjours a tous,
j'ai un problème sur mon serveur de messagerie instantanée voici mon code:

#! /usr/bin/env python2.7

import threading
import gtk
import gobject
import socket
import re
import time
import datetime

gobject.threads_init()

class MainWindow(gtk.Window):
def __init__(self):
super(MainWindow, self).__init__()
self.set_title("IM Client")
vbox = gtk.VBox()
hbox = gtk.HBox()
self.username_label = gtk.Label()
self.text_entry = gtk.Entry()
send_button = gtk.Button("envoyer")
self.text_buffer = gtk.TextBuffer()
text_view = gtk.TextView(self.text_buffer)
self.connect("destroy", self.graceful_quit)
send_button.connect("clicked", self.send_message)
self.text_entry.connect("activate", self.send_message)
vbox.pack_start(text_view)
hbox.pack_start(self.username_label, expand = False)
hbox.pack_start(self.text_entry)
hbox.pack_end (send_button, expand = False)
vbox.pack_end(hbox, expand = False)
self.add(vbox)
self.show_all()
self.configure()

def ask_for_info(self, question):
dialog = gtk.MessageDialog(parent = self, type = gtk.MESSAGE_QUESTION,

flags = gtk.DIALOG_MODAL |

gtk.DIALOG_DESTROY_WITH_PARENT,

buttons= gtk.BUTTONS_OK_CANCEL,

message_format = question)
entry = gtk.Entry()
entry.show()
dialog.vbox.pack_end(entry)
response = dialog.run()
response_text = entry.get_text()
dialog.destroy()
if response == gtk.RESPONSE_OK:
return response
else:
return None
def configure(self):
server = self.ask_for_info("server_address:port")
regex = re.search('^(\d+\.\d+\.\d+\.\d+):(\d+)$', server)
address = regex.group(1).strip()
port = regex.group(2).strip()
self.username = self.ask_for_info("username")
self.username_label.set_text(self.username)
self.network = Networking(self, self.username, address, int(port))
self.network.listen()
def add_text(self, new_text):
text_with_timestamp = "{0} {1}".format(date.datetime.now(),new_text)
end_itr = self.text_buffer.get_end_iter()
self.text_buffer.insert(end_itr, text_with_timestamp)
def send_message(self, widget):
new_text = self.text_entry.get_text()
self.text_entry.set_text("")
message = "{0} dit: {1}\n".format (self.username, new_text)
self.network.send(message)
def graceful_quit(self, widget):
gtk.main_quit()
self.network.send("QUIT")
self.network.tidy_up()

class Networking():
def __init__(self, window, username, server, port):
self.window = window
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((server, port))
self.listening = True
self.send("USERNAME {0}".format(username))
def listener(self):
while self.listening:
data = ""
try:
data = self.socket.recv(443)
except socket.error:
"impossible de recevoir les donnes"
self.handle_msg(data)
time.sleep(0.1)
def listen(self):
self.listen_thread = threading.Thread(target=self.listener)
self.listener_thread.daemon = True
self.listen_thread.start()
def send(self, message):
print "envoie: {0}".format(message)
try:
self.socket.sendall(message)
except socket.error:
print "impossible d'envoyer le message"
def tidy_up(self):
self.listening = False
self.socket.close()
gobject.idle_add(self.window.add_text, "server a quitter.\n")
def handle_msg(self, data):
if data == "QUIT":
self.tidy_up()
elif data == "":
self.tidy_up()
else:
gobject.idle_add(self.window.add_text, data)
if __name__ == "__main__":
MainWindow()
gtk.main()

et voici mon erreur:

Traceback (most recent call last):
File "./IM-Client.py", line 117, in <module>
MainWindow()
File "./IM-Client.py", line 34, in __init__
self.configure()
File "./IM-Client.py", line 58, in configure
regex = re.search('^(\d+\.\d+\.\d+\.\d+):(\d+)$', server)
File "/usr/lib/python2.7/re.py", line 146, in search
return _compile(pattern, flags).search(string)
TypeError: expected string or buffer

Merci d'avance pour vos réponses.

1 réponse

  1. Bonsoir.

    Pas difficile de déboguer.
    Quel type de valeur retourne la méthode ask_for_info ?
    1. C est une boîte de dialogue dans laquel je met l'adresse du serveur ainsi que le port. Lorsque je clique sur connect le programme plante et m'affiche le message d'erreur ci dessus
    2. @_armydead11Oui, et donc ça ne te choque pas de donner à manger à re.search une boîte de dialogue gtk ?

      if response == gtk.RESPONSE_OK:
          return response
      else:
          return None 


      Moi, je dirai que ce n'est pas response que ask_for_info doit retourner, mais response_text.

      D'ailleurs, tu auras aussi un plantage si ta méthode retourne None.
    3. Effectivement c est bien reponse_text, j avait fait des tests mais j ai oublier de remettre le text, mais le problème reste toujours présent même avec le _text après...
    4. @_armydead11Dans ce cas, un print de la variable server dans
      MainWindow.configure
      devrait te mettre sur la voie de pourquoi re.search plante avec cette variable server.
    5. Ça y est j ai réussi mais ne me demandez comment j ai fait je 'e le sait pas moi même...
      Mais j ai encore un autre problème... (voir photo)
      Si vous pourriez encore me filer un coup de main ce serait vraiment sympas...