繁体   English   中英

Python - 启动HTTP服务器并设置Windows系统托盘

[英]Python - start HTTP server AND set windows system tray

我有一个python脚本启动一个基本的Web服务器并响应某些输入,这工作正常。 我也有Windows系统托盘图标工作(显示一个ico文件) - 但目前脚本似乎在显示系统图标时阻止。

我只想让一个python HTTP服务器监听,并在脚本运行时显示系统托盘图标 - 这已经是一个隐藏的python窗口,我想知道它是否因任何原因失败。

我需要启动两个单独的线程吗? 或者有更好的方法吗? 这是我的原始代码(仅限摘录):

hover_text = "My Tray Icon Text"
def hello(sysTrayIcon): print "Hello World."
def simon(sysTrayIcon): print "Hello Simon."
def switch_icon(sysTrayIcon):
    pass
menu_options = (('Say Hello', None, hello),
                ('Switch Icon', None, switch_icon),
                ('A sub-menu', None, (('Say Hello to Simon', None, simon),
                                              ('Switch Icon', None, switch_icon),
                                             ))
               )
def bye(sysTrayIcon):
    print ("Server stopped by user")
    sys.exit()
    # server.shutdown()

print("setting system tray icon")
SysTrayIcon("hazard.ico", hover_text, menu_options, on_quit=bye, default_menu_index=1)

print("starting server")


#local only
#server = HTTPServer(('localhost', 9006), GetHandler)

#listen on all interfaces
server = HTTPServer(('0.0.0.0', 9006), GetHandler)

#print 'Starting server, use  to stop'
server.serve_forever()

我尝试在系统托盘图标设置之前移动服务器启动,如下所示:

thread = threading.Thread(target = server.serve_forever())

但它然后在服务器启动块阻止,没有设置图标。

我也尝试过这个

from SocketServer import ThreadingMixIn

class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass

srvr = ThreadingServer(('0.0.0.0', 9006), GetHandler)
srvr.serve_forever()

参考,但它仍然在服务器块阻止。

我应该使用多处理而不是多线程吗? 脚本相当小而且微不足道。

我假设SysTrayIcon()调用是阻塞的(不熟悉此函数,并且代码示例中缺少提供模块)。

如果是这样,那么一个解决方案是在您尝试的单独线程中启动服务器。 需要注意的一点是,当线程启动时,应该为Thread()target传递对函数的引用

所以你需要的代码就像:

server_thread = threading.Thread(target=server.serve_forever)
server_thread.start()

而不是调用方法。 在代码示例中,正在调用server.serve_forever ,因此该块(该方法永远阻止接受和处理HTTP请求)。

即使您从SocketServer选择了ThreadingMixIn ,对serve_forever的调用serve_forever应该在一个单独的线程中完成。 ThreadingMixIn允许服务器在不同的线程中提供每个HTTP请求,但是对serve_forever的调用仍将阻塞当前线程。

另外,当你的应用程序要停止时,我建议考虑一种正确的方法来停止服务器线程(例如使用threading.Event )。 或者在另一个线程中调用SysTrayIcon()很简单:

threading.Thread(target=SysTrayIcon, args=("hazard.ico", hover_text, menu_options), kwargs=dict(on_quit=bye, default_menu_index=1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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