繁体   English   中英

使用 python websocket 客户端与 tkinter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM