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