Socket,AttributeError:'str'对象没有属性'send'

时间:2016-04-23 11:04:30

标签: sockets python-3.x tkinter attributes

如果有人真的读到这个感谢!  无论如何,每次我运行我的代码时,我都会得到一个'AttributeError'而我无法找到问题所在。我正在使用Socket,tKinter,os和多处理。这是我的代码(我知道它现在是世界上最诡异的东西,但嘿,我只是在玩插座):

#---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控制台说这里有一个错误chat_msg_send_button = tk.Button(window, text = 'send', command = send(user, cleintsocket))会产生AttributeError: 'str' object has no attribute 'send'错误,但我看不出任何问题。

请帮忙。

再次感谢!

编辑:这是错误(现在不需要,但这是原则上的)

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'

1 个答案:

答案 0 :(得分:0)

首先关闭(正如@ R.Murry指出的那样)你正在调用函数立即并将它们的返回值作为命令传递,在这种情况下是None,所以我' d首先解决这个问题:

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'

您将变量cleintsocket传递给send并尝试使用套接字的.send方法,但它会初始化为空字符串:

cleintsocket = ''

因此,如果您在更改为send之前致电socket,您将收到该错误,只需检查它是否已初始化:

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