我正在尝试在 python 2.7 中使用 websocket 客户端。客户端在使用 IDLE 运行时工作正常,如接收到的消息所示。然而,尝试在 tkinter 文本小部件中插入 websocket 消息是行不通的。消息仍在 IDLE 中显示,但 tkinter 窗口根本不显示。
我使用的包名为 websocket-client 0.32.0,我从 here 下载了它。 .我按照有关如何制作类似 api 的 javascript 的说明进行操作,并对代码进行了一些调整。
这是我的代码:
from Tkinter import *
from websocket 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)
text = Text(master)
text.pack(expand=True,fill=BOTH)
def on_message(ws, message):
text.insert(END, 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("hi")
ws.send("test")
return
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()
master.mainloop()
以下是 IDLE 中显示的内容,如果这也有帮助的话:
--- request header ---
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: echo.websocket.org
Origin: http://echo.websocket.org
Sec-WebSocket-Key: tXWAVVlaRoq2S4+p/z12gg==
Sec-WebSocket-Version: 13
-----------------------
--- response header ---
HTTP/1.1 101 Web Socket Protocol Handshake
Connection: Upgrade
Date: Fri, 21 Aug 2015 05:16:54 GMT
Sec-WebSocket-Accept: LH12LFLFaek6HgCnGIugF0sg9lA=
Server: Kaazing Gateway
Upgrade: websocket
-----------------------
send: '\x81\x82{b\x97\xfc\x13\x0b'
send: '\x81\x84\xa5J\xecf\xd1/\x9f\x12'
Received: hi
Received: test
我已经被困在这个问题上一段时间了,但我找不到解决此类问题的方法。我是新手,非常感谢任何帮助。
请您参考如下方法:
嗯,我不使用 websocket,但问题似乎是,当你使用时 -
ws.run_forever()
应用程序进入无限循环,因此控件永远不会到达 master.mainloop() ,这是 tkinter 出现所必需的,这又是另一个无限循环,它只是关闭 gui 时退出。
你真正想要的是同时运行两个无限循环,这需要你在两个不同的线程中运行它们,目前它们都定义在同一个线程上,所以一个只会在另一个退出后运行。
一个快速的解决办法是使用 master.after() 有一定的延迟并给出一个函数,然后在函数中为一个函数启动一个新线程,其中 websocket 连接到服务器.这样两个无限循环都在不同的线程中。
但最好的解决方法是使用一个按钮,我们称它为 'Connect' 。然后该按钮的回调将是一个类似于下面的 on_connect() 的函数,它启动连接函数 -
def connect_to_socket():
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()
def on_connect():
import threading
t = threading.Thread(target=connect_to_socket)
t.start()
按钮会是这样的——
button = Button(master, text="Connect", command=on_connect)
然后您可以根据需要放置按钮。
