如何通过Python模块并行运行带无限循环的多.py文件并显示终端输出
解决tkinter按钮并行启动独立终端运行串口脚本的问题
我明白你的需求了——要通过tkinter的两个按钮分别启动两个持续读取COM口的脚本,让它们并行跑起来,各自在独立的终端窗口里输出数据。之前用os.system和runpy踩坑太正常了,这俩工具确实不适合这个场景,我给你推荐更靠谱的方案:用subprocess.Popen来创建独立进程,完美满足你的需求。
为什么之前的方法不行?
os.system是阻塞式的:运行一个脚本时,tkinter的主界面会直接卡住,没法再点另一个按钮,而且它没法同时启动两个独立终端。runpy是在当前进程执行脚本:会占用tkinter的事件循环,导致界面无响应,而且所有输出都会混在tkinter的启动终端里,没法分开显示。
解决方案代码
下面是完整的tkinter控制器代码,支持Windows、Linux和macOS,能帮你实现需求:
import tkinter as tk import subprocess import sys def launch_script(script_name): """通用的脚本启动函数,适配不同操作系统""" if sys.platform == "win32": # Windows系统:新开cmd窗口,运行脚本后保持窗口不关闭 subprocess.Popen( ["cmd", "/k", "python", script_name], creationflags=subprocess.CREATE_NEW_CONSOLE ) elif sys.platform == "darwin": # macOS系统:通过Terminal.app启动脚本 subprocess.Popen( ["open", "-a", "Terminal", "--args", "python3", script_name] ) else: # Linux系统:用xterm启动(如果没装xterm,可换成gnome-terminal等) subprocess.Popen( ["xterm", "-e", "python3", script_name] ) # 初始化tkinter主窗口 root = tk.Tk() root.title("COM口脚本控制器") root.geometry("300x150") # 设置窗口大小 # 创建按钮并绑定启动函数 btn_x = tk.Button( root, text="启动file_X.py", command=lambda: launch_script("file_X.py"), padx=15, pady=8 ) btn_x.pack(pady=12) btn_y = tk.Button( root, text="启动file_Y.py", command=lambda: launch_script("file_Y.py"), padx=15, pady=8 ) btn_y.pack(pady=12) # 启动tkinter主循环 root.mainloop()
关键细节说明
subprocess.Popen:它会创建一个完全独立的子进程,不会阻塞tkinter的主事件循环,两个脚本可以同时运行。- 跨系统适配:
- Windows用
cmd /k保证终端在脚本运行后不关闭,creationflags=subprocess.CREATE_NEW_CONSOLE强制新开一个终端窗口。 - macOS通过
open -a Terminal调用系统自带的终端来运行脚本。 - Linux用
xterm(如果你的系统用的是GNOME,可以换成gnome-terminal -- python3 script_name)。
- Windows用
- 脚本路径:确保
file_X.py和file_Y.py和这个tkinter脚本在同一目录下,或者把脚本名换成绝对路径(比如"C:/projects/file_X.py")。
可选优化(如果需要停止脚本)
如果之后需要加停止按钮,可以把subprocess.Popen返回的对象存起来,比如:
process_x = None def run_file_x(): global process_x process_x = subprocess.Popen(...) def stop_file_x(): if process_x: process_x.terminate()
这样就能通过按钮控制脚本的启停啦。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

