Skip to main content
 首页 » 编程设计

python之使用带有 tkinter 的 python websocket 客户端

2024年10月24日69lyj

我正在尝试在 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) 

然后您可以根据需要放置按钮。