TypeError: expected string or buffer

Signaler
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019
-
_armydead11
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019
-
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.

7 réponses

Bonsoir.

Pas difficile de déboguer.
Quel type de valeur retourne la méthode ask_for_info ?
_armydead11
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

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
> _armydead11
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Oui, 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.
_armydead11
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

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...
> _armydead11
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Dans 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.
_armydead11
Messages postés
4
Date d'inscription
jeudi 21 novembre 2019
Statut
Membre
Dernière intervention
21 novembre 2019

Ç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...