给cmd控制台程序 套壳 美化
给cmd控制台程序套壳美化,可以获取程序的标准输出和报错信息。
# _*_ coding: utf-8 _*_
""" 控制台程序启动器,杜绝黑窗口。
Time: 2023/10/18 15:28
Author: Jyun
Version: V 0.1
File: main.py
Blog: https://ctrlcv.blog.csdn.net
"""
import os
import subprocess
import threading
import time
import tkinter as tk# 设置 Python 的标准输出编码[配置项]
os.environ['PYTHONIOENCODING'] = 'gbk'# 窗口标题[配置项]
TITLE_BAR_TEXT = "Demo v1.0"# 程序名称[配置项]
MAIN_TITLE = "Program Name"# 程序停止时的状态提示[配置项]
STOPPED_STATE_TEXT = "Program stopped."# 程序运行时的状态提示[配置项]
RUNNING_STATE_TEXT = "Program running."# 程序启动脚本(可以是打包后的exe程序)[配置项]
COMMAND = ['python', 'test_program.py']THREADS_LIST = []def async_way(func):def wrapper(*args, **kwargs):t = threading.Thread(target=func, args=args, kwargs=kwargs)t.setDaemon(True)t.start()THREADS_LIST.append(t)return t # 返回线程对象用于后续操作return wrapperclass GUI(tk.Tk):def __init__(self):tk.Tk.__init__(self)self.process = Noneself.title(TITLE_BAR_TEXT)self.configure(bg="white")self.resizable(False, False)self.protocol("WM_DELETE_WINDOW", self.destroy)# 主标题self.label = tk.Label(self, text=MAIN_TITLE, font=("微软雅黑", 16), anchor="w", justify="left", bg="white")self.label.pack(fill="x", padx=25, pady=5)# 状态、操作栏块self.div = tk.Frame(self, bg="white")self.div.pack(fill="x", padx=25, pady=5)# 当前状态显示TXTself.state = tk.Label(self.div, text="Status Action Bar", font=("微软雅黑", 12), anchor="w", justify="left",bg="white")self.state.pack(side="left")# 日志显示区self.log_text = tk.Text(self, wrap=tk.WORD, width=60, height=20, bg="#f6f6f6", borderwidth=0, padx=10, pady=10)self.log_text.pack(padx=25, pady=(5, 25))# 停止按钮(如不需要 注释即可)self.stop_button = tk.Button(self.div, text="停止", width=10, command=self.stop, bd=0, bg="#ff8787")self.stop_button.pack(side="right")# 启动按钮(如不需要 注释即可)self.start_button = tk.Button(self.div, text="启动", width=10, command=self.start, bd=0, bg="#69db7c")self.start_button.pack(side="right")def log(self, message, color="black", autowrap=True):""" 输出日志:param message: 内容(行):param color: 文本颜色:param autowrap: 是否自动换行:return:"""message = str(message)if autowrap:message = message + "\n"self.log_text.tag_configure("custom_color", foreground=color)self.log_text.insert(tk.END, message, "custom_color")self.log_text.see(tk.END)# @async_waydef start(self):""" 启动子程序:return:"""self.state["text"] = RUNNING_STATE_TEXTif self.process is not None:self.log("程序正在运行,若要重新启动,请先停止", "red")returnself.process = subprocess.Popen(COMMAND, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)self.read_child_output()self.read_child_error()def stop(self):""" 停止子程序:return:"""# 程序正常运行时`self.process.poll()`为Noneif self.process is not None and self.process.poll() is None:self.process.terminate()self.log(f"等待进程结束:{self.process.pid}")self.wait_process_exit()else:self.process = None # !self.state["text"] = STOPPED_STATE_TEXTself.log("程序已经停止")self.log(f'辅助线程: {len(THREADS_LIST)}')self.release_thread()@async_waydef read_child_output(self):""" 获取子进程的标准输出:return:"""while True:try:output = self.process.stdout.readline()except UnicodeDecodeError as e:self.log(f'主线程输出解码错误 UnicodeDecodeError: {e}', color="red")continueif not output:breakself.log(output, autowrap=False)@async_waydef read_child_error(self):""" 获取子进程的错误信息:return:"""while True:output = self.process.stderr.readline()if not output:breakself.log(output, color="red", autowrap=False)@async_waydef wait_process_exit(self):""" 等待进程结束:return:"""while self.process.poll() is None:time.sleep(1)self.log(f"进程已结束,退出代码为 {self.process.poll()}")self.process = Noneself.state["text"] = STOPPED_STATE_TEXTdef release_thread(self):""" 释放已结束的线程:return:"""for thread in THREADS_LIST:if not thread.is_alive():thread.join()THREADS_LIST.remove(thread)self.log(f"释放线程:{thread}")def run(self):self.mainloop()if __name__ == '__main__':gui = GUI()gui.run()# TODO: 待实现
# 启动后自动运行子程序
# 添加日志长度限制
# 添加标题栏图标
# 添加程序图标
GUI示例:

相关文章:
给cmd控制台程序 套壳 美化
给cmd控制台程序套壳美化,可以获取程序的标准输出和报错信息。 # _*_ coding: utf-8 _*_ """ 控制台程序启动器,杜绝黑窗口。 Time: 2023/10/18 15:28 Author: Jyun Version: V 0.1 File: main.py Blog: https://ctrlcv.…...
【系统架构设计】架构核心知识: 1 构件和中间件
目录 一 构件 1 构件的特性 2 构件、对象和模块的对比 3 构件的复用...
通过开发者工具-网络排查响应时间过长的问题
关键词:network 网络 pending 开发者工具 有时候我们会发现某次http请求花费了很长时间,比如会花费十几秒,那么我们可以通过开发者工具的网络和其他一些工具来分析请求时间过长的原因 Dev Tool 中时间线各阶段代表的意义 分别用edge、chorm…...
【Python】Python 实现 Excel 到 CSV 的转换程序
Python 实现 Excel 到 CSV 的转换程序 Excel 可以将电子表格保存为 CSV 文件,只要点几下 鼠标,但如果有几百个 Excel文件要转换为 CSV , 就需要点击几小时。利用 openpyxl 模块, 编程读取当前工作目录中的所有 Excel 文件&#x…...
BUUCTF题解之[极客大挑战 2019]Havefun 1
1.题目分析 使用浏览器开发者工具查看网页源码,查看疑似flag的代码。 (特别是注释了的源码,一般是HTML,JS,PHP的源码) 修改统一资源定位符URL访问服务器后端接口,拿到flag。 1.URL URL是统一资源定位符(…...
DIV+CSS网页布局
本文参考 https://blog.csdn.net/ZhangJiWei_2019/article/details/114669722 二、浮动 浮动的元素会向左或向右浮动,直到碰到前面已经有浮动的元素或者是其父元素的边框为止。浮动的元素会脱离文档流(不再占有原来的位置)。 (…...
python二次开发CATIA:CATIA Automation
CATIA 软件中有一套逻辑与关系都十分严谨的自动化对象,它们从CATIA(Application)向下分支。每个自动化对象(Automation Object,以下简称Object)都有各自的属性与方法。我们通过程序语言调用这些 Object 的属性与方法,便…...
2023年中国云计算软件市场规模、市场结构及市场份额情况分析[图]
云计算是分布式计算的一种,指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序,然后,通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算软件类型分为三类,即基础设施即服务、平台即服…...
docker入门加实战—部署Java和前端项目
docker入门加实战—部署Java和前端项目 部署之前,先删除nginx,和自己创建的dd两个容器: docker rm -f nginx dd部署Java项目 作为演示,我们的Java项目比较简单,提供了一个接口: 配置文件连接docker里的m…...
机器人制作开源方案 | 行星探测车概述
1. 功能描述 行星探测车(Planetary Rover)是一种用于进行科学探索和勘测任务的无人车辆,它们被设计成能够适应各种复杂的地形条件和极端环境,以便收集数据、拍摄照片、采集样本等。行星探测车通常包含以下主要组件和功能ÿ…...
Git基础命令
一、Git 码云创建空白仓库 什么都不选,使用代码初始化 初始化仓库:git init 配置信息:git config user.name"mashuchao" 配置信息:git config user.email"mashuchao.com" 查看配置信息:git c…...
C#中Semaphore 和 CountdownEvent 的使用总结
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。一旦该关键代码段完成了,那么该线程必须释…...
THE PLANETS:EARTH vulnhub
信息收集 netdiscover -i eth0 -r 192.168.239.0,扫描存活主机,发现目标主机 对目标主机进行端口扫描:nmap -p- -sV -O -Pn -A 192.168.239.186,发现443端口存在DNS,域名 在本地得/etc/hosts中添加域名信息 浏览…...
【随想】每日两题Day.13
题目:344. 反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1: 输入&…...
CMake Cookbook
使用CMake软件对项目模块,进行构建、测试和打包。 Introduction - 《CMake菜谱(CMake Cookbook中文版)》 - 书栈网 BookStack https://github.com/dev-cafe/cmake-cookbook/tree/v1.0...
钢铁异常分类 few-shot 问题 小陈读paper 钢铁2
很清爽的 abstract 给出链接 前面的背景意义 其实 是通用的 这里替大家 整理一吓吓 1 缺陷分类在钢铁表面缺陷检测中 有 意义。 2 大多数缺陷分类模型都是基于完全监督的学习, 这需要大量带有图像标签的训练数据。 在工业场景中收集有缺陷的图像是非常困难…...
flask实战(问答平台)
问答平台项目结构搭建 先创建一个配置文件config.py,后面有些配置写在这里 #app.py from flask import Flask import configapp Flask(__name__) #绑定配置文件 app.config.from_object(config)app.route(/) def hello_world(): # put applications code herer…...
RK3568驱动模块编译进内核
一、创建文件 首先在drivers/char目录下创建hello文件夹,然后在hello文件夹下创建hello.c 文件、Kconfig和Makefile文件。 hello.c 文件内容如下 #include <linux/module.h> #include <linux/kernel.h> static int __init helloworld_init(void) …...
黑马程序员Java Web--14.综合案例--修改功能实现
一、BrandMapper包 首先,在BrandMapper包中定义用来修改的方法,和使用注解的sql语句。 BrandMapper包所在路径: package com.itheima.mapper; /**** 修改* **/Update("update tb_brand set brand_name #{brandName},company_name #{c…...
开源协议介绍
文章目录 一、简介二、常见开源协议介绍2.1 BSD (Berkeley Software Distribution license)2.2 MIT(Massachusetts Institute of Technology)2.3 Apache Licence 2.02.4 GPL(General Public License)2.5 LG…...
不止是拆网卡:以联想ThinkCentre M7131z为例,聊聊老旧一体机的升级改造可能性
联想ThinkCentre M7131z改造指南:从拆网卡到全面性能升级 老旧商用一体机往往被贴上"性能瓶颈"的标签,但联想ThinkCentre M7131z系列却隐藏着令人惊喜的改造潜力。这台发布于2015年前后的商用一体机,凭借其模块化设计和充足的内部空…...
Pinyin-pro 3.15.1版本避坑指南:老项目兼容性问题解决方案
Pinyin-pro 3.15.1版本避坑指南:老项目兼容性问题解决方案 在技术迭代飞快的今天,前端开发者常常面临一个尴尬局面:新发布的工具库在功能上令人惊艳,却因为底层依赖或语法特性与老项目环境不兼容而无法直接使用。Pinyin-pro作为中…...
openEuler系统下NFS服务器配置实战:多场景权限管理与安全优化
1. NFS服务基础与openEuler环境准备 NFS(Network File System)是Linux系统中实现文件共享的经典方案,它允许不同主机通过网络访问远程文件系统,就像操作本地文件一样方便。在openEuler这个企业级Linux发行版上配置NFS服务…...
CogVideoX-2b完整功能测评:一键部署+本地渲染+隐私安全全解析
CogVideoX-2b完整功能测评:一键部署本地渲染隐私安全全解析 1. 为什么选择本地化视频生成工具 在内容创作领域,视频制作一直是门槛较高的技能。传统视频制作需要专业的剪辑软件、大量的素材积累以及复杂的时间线操作。而云端视频生成服务虽然降低了技术…...
BUUCTF-[HITCON 2017]SSRFme
代码分析<?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) { //HTTP_X_FORWARDED_FOR可以获取客户端真正ip地址,和各个代理IP地址$http_x_headers explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]); //拆分字符串,以,分割$_SERVER[REMOTE…...
讲透RenderTarget · 第一章:RenderTarget 是什么
**欢迎新朋友点赞、关注、收藏三连。第一章:RenderTarget 是什么一句话概括: RenderTarget 就是 GPU 的"画布"——不一定画在屏幕上,可以画在任何一块显存里。⏱ 30 秒概览RenderTarget(RT) GPU 可以写入像素…...
跨平台终端与进程控制:从原理到实践
跨平台终端与进程控制:从原理到实践 【免费下载链接】node-pty Fork pseudoterminals in Node.JS 项目地址: https://gitcode.com/gh_mirrors/no/node-pty 在现代软件开发中,终端交互和进程管理是不可或缺的核心能力。无论是构建IDE、开发自动化工…...
AI写专著必备攻略:专业工具推荐,轻松开启学术专著创作之旅
学术专著写作困境与AI工具解决方案 学术专著的严谨性,离不开大量资料和数据的支持。资料的搜集和数据整合,往往是写作过程中最为繁琐和耗时的环节。研究者必须全面检索国内外的前沿文献,以确保这些文献的权威性和相关性,同时还要…...
ssm+java2026年毕设体育赛事管理系统App【源码+论文】
本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于赛事管理问题的研究,现有研究主要以大型综合性体育赛事(如奥运会、亚运会)的信息化管理…...
Mirage Flow 与卷积神经网络(CNN)的跨模态融合应用
Mirage Flow 与卷积神经网络(CNN)的跨模态融合应用 你有没有想过,让机器不仅能“看见”图片,还能像人一样“理解”并“描述”图片里的故事?比如,给一张复杂的医学影像,它不仅能圈出病灶&#x…...
