给cmd控制台程序 套壳 美化

2023-10-18 22:04

本文主要是介绍给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控制台程序 套壳 美化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/235395

相关文章

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

IDEA如何让控制台自动换行

《IDEA如何让控制台自动换行》本文介绍了如何在IDEA中设置控制台自动换行,具体步骤为:File-Settings-Editor-General-Console,然后勾选Usesoftwrapsin... 目录IDEA如何让控制台自http://www.chinasem.cn动换行操作流http://www

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的