import subprocess
import tkinter as tk
from tkinter import ttk, messagebox
from subprocess import Popen, run, PIPE# 启动Nacos的函数
def start_nacos():startup_cmd_path = r'D:\environment\code-software\nacos-server-1.4.1\nacos\bin\startup.cmd'# 异步启动NacosPopen([startup_cmd_path, '-m', 'standalone'])messagebox.showinfo("Nacos状态", "Nacos 启动命令已发送,请检查Nacos是否已启动。")# 启动Redis的函数
def start_redis():Popen([r'D:\environment\redis\Redis-x64-5.0.14.1\redis-server.exe',r'D:\environment\redis\Redis-x64-5.0.14.1\redis.windows.conf'])messagebox.showinfo("Redis状态", "Redis启动命令已发送,请检查Redis是否已启动。")# 查找指定端口占用的进程ID
def find_pid_by_port(port):"""通过端口号查找对应的进程ID(PID):param port: 要查找的端口号:return: 端口对应的进程ID,如果找不到则返回None"""# 构造命令行命令,使用netstat -ano列出所有连接和侦听端口,然后通过findstr搜索指定端口command = f"netstat -ano | findstr :{port}"# 执行命令行命令,shell=True允许命令通过shell执行,stdout和stderr捕获输出,text=True确保输出为文本result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)# 检查命令执行是否成功(即返回值是否为0),如果不成功(如找不到端口)则返回Noneif result.returncode != 0:return None# 遍历命令输出的每一行for line in result.stdout.split('\n'):# 将每行按空格分割成多个部分parts = line.split()# 如果分割后的列表不为空,取最后一个元素作为可能的PID部分# 如果列表为空,则pid_part设置为空字符串pid_part = parts[-1] if parts else ''# 检查pid_part是否全为数字且大于0,如果是,则返回该PIDif pid_part.isdigit() and int(pid_part) > 0:return int(pid_part)# 如果遍历完所有行都没有找到合适的PID,则返回Nonereturn None# 杀死指定PID的进程
def kill_process(pid):command = f"taskkill /F /PID {pid}"result = run(command, shell=True, stdout=PIPE, stderr=PIPE, text=True)if result.returncode == 0:return f"进程ID为 {pid} 的进程已成功被杀死。"else:return f"无法杀死进程ID为 {pid} 的进程: {result.stderr}"# 按钮点击事件处理函数
def on_button_click():"""处理按钮点击事件,用于查找并可能杀死监听在指定端口上的进程。"""# 从某个GUI组件(如Entry小部件)中获取用户输入的端口号port_input = port_entry.get()try:# 尝试将用户输入的字符串转换为整数port = int(port_input)# 调用find_pid_by_port函数查找端口对应的进程IDpid = find_pid_by_port(port)# 如果找到了进程IDif pid:# 调用kill_process函数尝试杀死该进程,并获取操作结果消息message = kill_process(pid)# 使用messagebox显示操作结果messagebox.showinfo("进程操作结果", message)else:# 如果没有找到进程ID,显示消息框告知用户messagebox.showinfo("未找到进程", f"没有找到监听在端口 {port} 上的进程。")except ValueError:# 如果在转换端口号时发生ValueError(即输入的不是有效的整数),显示错误消息messagebox.showerror("输入错误", "请输入有效的端口号(整数)。")# 主函数
def main():root = tk.Tk()root.title("服务启动器")# 输入端口号的标签和输入框label = tk.Label(root, text="请输入端口号:")label.pack(pady=10)global port_entryport_entry = tk.Entry(root) # 使用局部变量,通过闭包在on_button_click中访问port_entry.pack(pady=10)# 杀死进程按钮kill_button = tk.Button(root, text="杀死进程", command=on_button_click)kill_button.pack(pady=10)# 放置启动按钮的Frameframe = ttk.Frame(root, padding="50 50 50 50")frame.pack(pady=20)# 启动Nacos和Redis的按钮btn_start_nacos = ttk.Button(frame, text="启动Nacos", command=start_nacos)btn_start_nacos.pack(side=tk.LEFT, padx=10, pady=10)btn_start_redis = ttk.Button(frame, text="启动Redis", command=start_redis)btn_start_redis.pack(side=tk.RIGHT, padx=10, pady=10)# 尝试设置ttk主题style = ttk.Style()try:style.theme_use('clam')except tk.TclError:print("主题clam不可用,使用默认主题。")root.mainloop()if __name__ == "__main__":main()
打包成exe文件
命令:
pip install Pyinstallerpyinstaller -F --noconsole .\你的文件名.py