龙卷风和 tkinter 在一起

tornado and tkinter together

我是 python 编程新手。请耐心等待。我正在使用 python 3 并且我需要打开一个 websocket 通信并显示一个图形界面。但是,如果我将它们放在相同的代码中,它们将无法工作,因为它们都在循环函数上工作。

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
from tkinter import *
class ConfigurationHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print ("Connection Opened")
        self.write_message("connected")
    def on_close(self):
        print ("Connection Closed")

    def on_message(self, message):
        print (("Message received: {}").format(message))
        self.write_message(message)
    def check_origin(self, origin):
        return True

try:
    application= tornado.web.Application([(r"/",ConfigurationHandler)])

    if __name__ == "__main__":
        app=tornado.httpserver.HTTPServer(application)
        print("waiting")
        app.listen(8000)
        tornado.ioloop.IOLoop.instance().start()
        root=Tk() #I need to see this window
        root.mainloop()
except (KeyboardInterrupt,SystemExit):
    raise
except:
    print("Error")

抱歉我的英语不好, 提前致谢!

感谢@DoNotClick 我解决了我的问题。

解决方案:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
from tkinter import *
import threading
class ConfigurationHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        print ("Connection Opened")
        self.write_message("connected")
    def on_close(self):
        print ("Connection Closed")
    def on_message(self, message):
        print (("Message received: {}").format(message))
        self.write_message(message)
    def check_origin(self, origin):
        return True
class myThread (threading.Thread):
    def __init__(self,name):
        threading.Thread.__init__(self)
        self.name=name
    def run(self):
        try:
             application= tornado.web.Application([(r"/",ConfigurationHandler)])
            if __name__ == "__main__":
                app=tornado.httpserver.HTTPServer(application)
                print("waiting")
                app.listen(8000)
                tornado.ioloop.IOLoop.instance().start()
        except (KeyboardInterrupt,SystemExit):
            raise
        except:
            print("Error")
            on_finish()
root=Tk()
thread1=myThread("Connection")
thread1.start()
root.mainloop()

如果您使用 tornado.ioloop.IOLoop.instance().start(),将启动一个循环,它将阻塞当前线程,直到调用 tornado.ioloop.IOLoop.instance().stop(),但这也会停止龙卷风服务器。如果你想执行另一个循环,比如 tkinter mainloop,那么你必须在另一个线程中同时执行 运行 这两个循环。如果您不知道什么主题,只需搜索 python 主题教程