![](/img/trans.png)
[英]python websocket client with tkinter. but not working mainloop
[英]Using python websocket client with tkinter
我正在尝试在 python 2.7 中使用 websocket 客户端。 客户端在使用 IDLE 运行时工作正常,如接收到的消息所示。 但是,尝试在 tkinter 文本小部件中插入 websocket 消息无效。 IDLE 中还在显示消息,但是 tkinter window 根本没有显示。
我正在使用的 package 称为 websocket-client 0.32.0,我从这里下载了它。 我按照有关如何制作 javascript(如 api)的说明进行操作,并对代码进行了一些调整。
这是我的代码:
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()
并有一定的延迟并给出 function,然后在 function 中为 function 启动一个新线程,其中 websocket 连接到服务器。 这样两个无限循环都在不同的线程中。
但最好的解决办法是使用一个按钮,我们称之为'Connect'
。 那么该按钮的回调将是一个 function,就像下面的on_connect()
一样,它启动 function 进行连接 -
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)
然后您可以根据需要放置按钮。
多亏了阿南德的回应,我才能够找出问题所在。 工作和更新的代码发布在下面:
from Tkinter import *
from websocket import *
from threading import *
master = Tk()
master.wm_title("Team Black Client")
master.withdraw()
minwidth = master.winfo_screenwidth()/4*3
minheight = master.winfo_screenheight()/4*3
master.minsize(width=minwidth, height=minheight)
x = (master.winfo_screenwidth() - minwidth)/2
y = (master.winfo_screenheight() - minheight)/2
master.geometry("+"+str(x)+"+"+str(y))
master.deiconify()
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
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.