2015-08-23 210 views
0

我无法在python 2.7中的tkinter中发送websocket消息。我目前有一个tkinter和一个websocket客户端运行在一个线程中,所以他们两个循环同时工作,见here。问题是,每当我尝试输入消息并按下发送按钮,我就会得到一个NameError。我正在使用的websocket客户端是herePython在tkinter中发送websocket消息

这是我的代码:

from Tkinter import * 
from websocket import * 
from threading import * 

master = Tk() 
master.wm_title("Websocket Test") 
minwidth = master.winfo_screenwidth()/4*3 
minheight = master.winfo_screenheight()/4*3 
master.minsize(width=minwidth, height=minheight) 
master.resizable(0,0) 

def sendmsg(): 
    msg = entry.get() 
    ws.send(msg) 
    return 

text = Text(master) 
text.pack(side=TOP, expand=True,fill=BOTH) 
entry = Entry(master) 
entry.pack(side=BOTTOM, expand=True, fill=BOTH) 
button = Button(master, text="SEND", command=sendmsg) 
button.pack(side=BOTTOM, expand=True, fill=BOTH) 

def on_message(ws, message): 
    text.insert(END, "Received: "+message+"\n") 
    print "Received: "+message 
    return 

def on_error(ws, error): 
    text.insert(END, error+"\n") 
    print error 
    return 

def on_close(ws): 
    text.insert(END, "### closed ###\n") 
    print "### closed ###" 
    return 

def on_open(ws): 
    ws.send("hello") 
    ws.send("testing") 
    return 

def connection(): 
    enableTrace(True) 
    ws = WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close) 
    ws.on_open = on_open 

    ws.run_forever() 
    return 

t = Thread(target=connection) 
t.start() 

master.mainloop() 

这是错误消息我在空闲状态,每当我试图发送一个消息:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__ 
    return self.func(*args) 
    File "C:\Users\User\Desktop\thing.py", line 14, in sendmsg 
    ws.send(msg) 
NameError: global name 'ws' is not defined 

我觉得这事做的线程,但我不确定是什么导致了这个问题。 websocket on_open函数使用ws.send()将消息成功发送到服务器,但sendmsg函数不会。所有的帮助表示赞赏,因为我对线程完全陌生。

回答

0

那是因为你做

def sendmsg(): 
    msg = entry.get() 
    ws.send(msg) 
    return 

您需要先初始化的WebSocket:

def sendmsg(): 
    ws = WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close) 
    msg = entry.get() 
    ws.send(msg) 
    return 

它看起来像你这样做以后创建WS实例,内connection(),你做ws = WebSocketApp("ws://echo.websocket.org/", on_message = on_message, on_error = on_error, on_close = on_close)。在使用ws之前,请确保你已经完成了这个工作,因为那是它被定义的地方。

+1

虽然我不认为这是问题。 websocket由连接函数启动,该函数以线程启动。除非使用sendmsg以某种方式不承认,这是我需要修复的。 –

+0

尝试在sendmsg()函数中添加'ws = WebSocketApp(“ws://echo.websocket.org/”,on_message = on_message,on_error = on_error,on_close = on_close)''。 – rofls

+0

我将它更新为你发布的内容,现在它说'Tkinter回调中的异常 回溯(最近调用最后一次): 文件“C:\ Python27 \ lib \ lib-tk \ Tkinter.py“,第1486行,在__call__中 return self.func(* args) sendmsg文件”C:\ Users \ User \ Desktop \ thing.py“,第15行 ws.send (msg) 文件“C:\ Python27 \ lib \ site-packages \ websocket_client-0.32.0-py2.7.egg \ websocket \ _app.py”,第105行,发送 raise WebSocketConnectionClosedException(“Connection is already closed 。“) WebSocketConnectionClosedException:连接已关闭。 –