Tkinter Window 在脚本 运行 服务器后冻结

Tkinter Window Freezes after Running a Server from Script

我正在制作一个程序来创建一个单独的 python 网络服务器,该服务器是:

import os, sys
from http.server import HTTPServer, CGIHTTPRequestHandler

webdir = '.'
port = 8000
print('Server Now Running')
os.chdir(webdir)
srvraddr = (('' , port))
srvrobj = HTTPServer(srvraddr, CGIHTTPRequestHandler)
srvrobj.serve_forever()

然后原始程序从命令行运行该服务器:

def runServer(self):
    os.system('Webserver.py')

所有这些都是通过 Tkinter window 中的按钮完成的。调用此函数时,Tkinter window 冻结并且无法按下下一个按钮(会通过服务器在 Safari 中拉出本地 html 文件)。

我环顾四周,看起来我可能需要穿线或其他东西...

我对如何处理这件事一无所知。有需要的可以提供更多我的原创程序(有点笨拙)

我正在寻找一个简单的解决方案,或者可能是一个具体的参考资料,以帮助我朝着正确的方向前进。

Python 非常新(3 个月),所以请牢记这一点。

由于被调用程序的退出代码是函数os.system的return值,所以程序会一直阻塞,直到被调用程序退出。

请尝试使用非阻塞 subprocess.Popen

使用subprocess

import subprocess

s = subprocess.Popen(['Webserver.py'])

或者可能需要 python 才能启动脚本

s = subprocess.Popen(['python', 'Webserver.py'])

或者你可以 运行

s = subprocess.Popen(['python3', '-m', 'http.server', '--cgi', '8000'])

稍后您可以停止进程

s.kill()

  • Popen(没有参数 shell=True)期望参数作为列表
  • 关闭程序后子进程仍然有效,因此您必须在关闭程序之前杀死它们。