2016-04-23 6 views
0

Wenn wirklich jemand diesen Dank liest! Anyway auf das Problem, jedes Mal, wenn ich meinen Code ausführen, bekomme ich eine 'AttributeError' und ich kann nicht finden, wo das Problem ist. Ich benutze Socket, tKinter, os und Multiprocessing. Hier ist mein Code (Ich weiß, sie jetzt die pythony Sache in der Welt, aber hey ich spiele nur mit Buchsen):Socket, AttributeError: 'str' Objekt hat kein Attribut 'send'

#---Import statments---# 
import socket, os, multiprocessing 
import tkinter as tk 

#---global variables---# 
setup = '' 
cleintsocket = '' 

#---Defs---# 
def setup(): 
    global host, port, user 
    host = setup_host_box.get() 
    port = setup_port_box.get() 
    user = setup_user_box.get() 

def connect(self, hostname, connectingport): 
    self.connect((hostname, int(connectingport))) 
    print('connected') 
    multiprocessing.Process(target = resv()).start() 

def create_sock(nhost, nport): 
    global cleintsocket 
    cleintsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    connect(cleintsocket, nhost, nport) 

def send(username, cleintsock): 
    '''to send a message''' 
    usrmsg = (username + ' - ' + chat_msg_box.get()).encode() 
    cleintsock.send(usrmsg) 

def resv(sock): 
    '''resive subscript, run through mutiprosses module''' 
    while True: 
     rmsg = sock.recv(1024).decode() 
     chat_msg_display_text.insert('end.0.', rmsg) 

def chat(): 
    '''loads chat page''' 
    setup_host_text.pack_forget() 
    setup_host_box.pack_forget() 
    setup_port_text.pack_forget() 
    setup_port_box.pack_forget() 
    setup_user_text.pack_forget() 
    setup_user_box.pack_forget() 
    setup_confirm_button.pack_forget() 
    chat_msg_desplay_text.pack() 
    chat_msg_box.pack() 
    chat_msg_send_button.pack() 

def start(): 
    '''starts the setup page''' 
    setup_host_text.pack() 
    setup_host_box.pack() 
    setup_port_text.pack() 
    setup_port_box.pack() 
    setup_user_text.pack() 
    setup_user_box.pack() 
    setup_confirm_button.pack() 

#---TK Setup---# 
#--window setup--# 
window = tk.Tk() 
window.title('Chat') 
window.geometry('600x600') 
window.configure(background='#ffffff') 
#--connection setup page--# 
setup_host_text = tk.Label(window, text = 'Host') 
setup_host_box = tk.Entry(window, bg = '#ffffff') 
setup_port_text = tk.Label(window, text = 'Port') 
setup_port_box = tk.Entry(window, bg = '#ffffff') 
setup_user_text = tk.Label(window, text = 'Username') 
setup_user_box = tk.Entry(window, bg = '#ffffff') 
setup_confirm_button = tk.Button(window,text = 'Connect', command = setup()) 
#--chat page--# 
chat_msg_box = tk.Entry(window, bg='#ffffff') 
chat_msg_send_button = tk.Button(window, text = 'send', command = send(user, cleintsocket)) 
chat_msg_display_text = tk.Text(window, width=600, height=500, wrap = 'word') 
#--------------# 

start() 

Die Python-Konsole sagt es ist ein Fehler, hier chat_msg_send_button = tk.Button(window, text = 'send', command = send(user, cleintsocket)), die jedoch einen AttributeError: 'str' object has no attribute 'send' Fehler erzeugt Ich sehe keine Probleme damit.

Bitte helfen.

Danke nochmal!

EDIT: Hier ist der Fehler (momentan nicht benötigt, aber das ist für Prinzip)

Traceback (most recent call last): 
    File ".../tkcleint.py", line 76, in <module> 
    chat_msg_send_button = tk.Button(window, text = 'send', command = send(user, cleintsocket)) 
    File ".../tkcleint.py", line 29, in send 
    cleintsock.send(usrmsg) 
AttributeError: 'str' object has no attribute 'send' 
+0

Für den Anfang müssen Sie eine 'lambda' Funktion in der Zeile verwenden, die den 'AttributeError' anhebt, wie folgt:' chat_msg_send_button = tk.Button (window, text =' senden ', command = lambda: send (user, kleinsocket)) '. Wenn das Ihr Problem löst, lassen Sie es mich wissen und ich werde es als Antwort posten. –

Antwort

0

Zunächst einmal (wie @ R.Murry hat darauf hingewiesen) Sie die Funktionen aufrufen sofort und Weitergabe ihrer Rückkehr Wert als Befehl in diesem Fall die None ist, so würde ich durch die Festsetzung beginnen, dass bis:

setup_confirm_button = tk.Button(window,text = 'Connect', command = setup) #don't call setup here 
... 
def send_button_callback(): 
    send(user, cleintsocket) 
chat_msg_send_button = tk.Button(window, text = 'send', command = send_button_callback) 

nächsten, es wichtig ist, die ganzen Fehler enthielten Nachricht in Frage, weil das nicht die Linie ist, die Probleme ausgeführt wird:

Traceback (most recent call last): 
    File ".../test.py", line 76, in <module> 
    chat_msg_send_button = tk.Button(window, text = 'send', command = send(user, cleintsocket)) 
    File ".../test.py", line 29, in send 
    cleintsock.send(usrmsg) 
AttributeError: 'str' object has no attribute 'send' 

Sie die Variable cleintsocket in send geben und versuchen, die .send Methode einer Steckdose zu verwenden, aber es wird auf eine leere Zeichenfolge initialisiert:

cleintsocket = '' 

so, wenn Sie send aufrufen, bevor es zu einem socket geändert wird Ihnen die Fehlermeldung angezeigt wird, einfach prüfen, ob es noch initialisiert wurde:

def send(username, cleintsock): 
    '''to send a message''' 
    if cleintsock: #not an empty string 
     usrmsg = (username + ' - ' + chat_msg_box.get()).encode() 
     cleintsock.send(usrmsg) 
    #else:window.bell() #play a error beep 
+0

@Tagh McDonald-Jensen Danke für die Hilfe! Es funktioniert jetzt gut. –

+0

gut das Bit funktioniert gut –

+0

Dank @R. Murray für die Hilfe auch –