2016-04-23 37 views
0

誰か実際にこの感謝をお読みください! とにかく問題に、私は私のコードを実行するたびに、私は 'AttributeError'を取得し、問題がどこに見つけることができません。私はソケット、tKinter、OSとマルチプロセッシングを使用しています。ここに私のコードは、(私は世界で今最もpythony事を知っているが、ちょっと、私はちょうどソケットで遊んだ)です:ソケット、AttributeError: 'str'オブジェクトには属性 '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() 

のpythonコンソールしかしAttributeError: 'str' object has no attribute 'send'エラーが発生し、ここでエラーchat_msg_send_button = tk.Button(window, text = 'send', command = send(user, cleintsocket))があると言っています私はそれに何か問題を見ることはできません。

助けてください。

もう一度おねがいします!

編集:ここではエラーになります(現在必要とされていないが、これが原則のためである)(@ R.Murryが指摘したように)

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

最初に 'AttributeError'を呼び出す行に' lambda'関数を使用する必要があります: 'chat_msg_send_button = tk.Button(window、text = 'send'、command = lambda:send(user、cleintsocket )) ')。それがあなたの問題を解決するなら、私に知らせてください。私は答えとして投稿します。 –

答えて

0

まず第一には、あなたがすぐにを機能を呼び出し、その戻り値を渡していますこの場合にはNoneあるので、私はそれを固定することにより、起動したいコマンドとして値:

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) 

全体エラーを含めることが重要ですあなたの質問内のメッセージ、それは問題に実行しているラインではないので:

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' 

あなたはしかし、それは、空の文字列に初期化され、sendに変数cleintsocketを渡し、ソケットの.sendメソッドを使用してみてください:

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 
:それはsocketに変更される前に

cleintsocket = '' 

ので、あなたは、単にそれがまだ初期化されているかどうかを確認し、そのエラーを取得しますsendを呼び出す場合

+0

@Taghg McDonald-Jensen助けてくれてありがとう!今はうまくいく。 –

+0

そのビットはうまく動作します –

+0

@Rに感謝します。マレーも助けを求める –

関連する問題