【发布时间】:2015-08-23 22:37:27
【问题描述】:
我在 python 2.7 上的 tkinter 中发送 websocket 消息时遇到问题。我目前有 tkinter 和一个 websocket 客户端在一个线程中运行,因此它们两个循环同时工作,如 here 所示。问题是,每当我尝试输入消息并按下发送按钮时,都会收到 NameError。我使用的 websocket 客户端是here。
这是我的代码:
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()
这是我在尝试发送消息时在 IDLE 中收到的错误消息:
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 函数没有。感谢所有帮助,因为我对线程完全陌生。
【问题讨论】:
标签: python multithreading python-2.7 tkinter websocket