Socket,AttributeError:'str'对象没有属性'send'
如果有人真的读到这个谢谢! 无论如何,我每次运行代码时都会遇到一个'AttributeError',我找不到问题所在。我使用Socket,tKinter,os和multiprocessing。这里是我的代码(我知道它现在最pythony的事情在世界上,但嘿,我刚刚与插座扮演):Socket,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()
蟒蛇控制台是说这里存在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'
第一关(如@ R.Murry指出)您呼叫的功能立即并通过他们的回归值作为命令,在这种情况下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)
旁边,它包括整个错误是非常重要的消息在你的问题,因为这是不运行到的问题是:你传递变量cleintsocket
为send
,并尝试使用一个插座的.send
方法
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
之前更改为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
@Taghg McDonald-Jensen感谢您的帮助!现在它工作正常。 –
那么这工作正常 –
感谢@R。 Murray也有帮助 –
首先你需要在提高'AttributeError'的行中使用'lambda'函数,像这样:'chat_msg_send_button = tk.Button(window,text ='send',command = lambda:send(user,cleintsocket ))'。如果解决了您的问题,请告诉我,我会将其作为答案发布。 –