给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示例:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告

本心、输入输出、结果 文章目录 文心一言 4.0 ERNIE-Bot 4.0 :ERNIE-Bot 4.0 大模型深度测试体验报告前言相关跳转文心一言 4.0 ERNIE-Bot 4.0 接口简介Bash 请求示例代码Windows 模式使用 Python 请求如果直接使用官方提供的代码文心一言 4.0 ERNIE-Bot 4.0 API 在…

【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory

概念 关于微服务网关Gateway中有几十种过滤工厂,这一篇博文记录的是关于请求限流过滤工厂,也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理,如果不会被处理就会返回HTTP状态码为42…

【LeetCode刷题(数据结构)】:给定一个链表 每个节点包含一个额外增加的随机指针 该指针可以指向链表中的任何节点或空节点 要求返回这个链表的深度拷贝

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next…

离线 notepad++ 添加到右键菜单

复制下面代码,修改文件后缀名为:reg Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\Notepad\\notepad.exe,0"[HKEY_CLASSES_ROOT\*\shell\NotePad\Command] "D:\…

华为Atlas 200I DK A2开发者套件--基础使用配置

文章目录 前言一、快速开始二、通过路由器联网三、USB相机总结 前言 Atlas 200I DK A2基础使用配置方法。准备好键鼠、显示器、网线、USB拓展器。 一、快速开始 下载最新官方Windows版本昇腾开发者套件一键制卡工具: https://ascend-repo.obs.cn-east-2.myhuaweic…

Android攻城狮学鸿蒙-Tab

Entry Component struct TabPage {State message: string Hello World;private controler: TabsController new TabsController();build() {Column() {Tabs({ barPosition: BarPosition.Start, controller: this.controler }) {TabContent() {Column() {Text(哈哈哈哈).fontS…

ESP RainMaker 客户案例 #1|Halonix

Halonix 是印度规模增长最快的电器公司之一,专注于照明、风扇等电器产品,正在进军健康和安全领域,现已推出紫外线消毒器和安全摄像头。Halonix 致力于创新,不断采用新兴前沿技术实现产品迭代,并通过加强设备间的互联互…

jquery.i18n.properties.js使用及seo优化

使用方法 具体使用方法可以参考jquery.i18n.properties的使用讲解与实例 这篇博客,这里仅简单示例 1、下载 jquery.i18n.properties.js文件,地址: jquery.i18n.properties.js 2、设创建语言properties文件,如:strings…

FPGA基于1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC1G/2.5G Ethernet PCS/PMA or SGMIIQT上位机和源…

解决Drag and drop is not supported导致无法将物理机上的文件拖入Ubuntu

问题起因 因为需要拷贝一个文件从物理机到虚拟机,但是我又不想用有关ftp的程序或者协议,但是直接拖又报错Drag and drop is not supported,索性上网查询了一下解决方法,自己记录一下。 解决方法 安装下面两个程序 sudo apt in…

css 特别样式记录

一、 这段代码神奇的地方在于, 本来容器的宽度只有1200px,如果不给img赋予宽度100%,那么图片 会超出盒子,如果给了img赋予了宽度100%,多个图片会根据自己图片大小的比例,去分完那1200px,如图二。…

xml schema中的all元素

说明 xml schema中的all元素表示其中的子元素可以按照任何顺序出现&#xff0c;每个元素可以出现0次或者1次。 https://www.w3.org/TR/xmlschema-1/#element-all maxOccurs的默认值是1&#xff0c;minOccurs 的默认值是1。 举例 <element name"TradePriceRequest&…

【STM32】---存储器,电源核时钟体系

一、STM32的存储器映像 1 文中的缩写 2 系统构架&#xff08;原理图&#xff09; 3. 存储器映像 &#xff08;1&#xff09;STM32是32位CPU&#xff0c;数据总线是32位的 &#xff08;2&#xff09;STM232的地址总线是32位的。&#xff08;其实地址总线是32位不是由数据总线是…

EV SSL数字证书贵吗

EVSSL证书通常适用于具有高需求的网站和企业&#xff0c;特别是涉及在线交易、金融服务、电子商务平台等需要建立用户信任的场景。大型企业、金融机构、电子商务平台等可以受益于使用EV证书来提升品牌形象和安全性。 申请EVSSL证书&#xff08;Extended Validation SSL certifi…

极光笔记 | 发送功能使用技巧分享

在全球化竞争激烈的商业环境中&#xff0c;高效的消息通知解决方案是企业成功的关键。EngageLab作为一家专注于海外市场的消息服务平台&#xff0c;为全球企业提供了一体化的消息通知解决方案。其中&#xff0c;EngageLab的国际邮件发送是其强大而灵活的产品服务之一。本文将与…

5.覆盖增强技术——PUCCHPUSCH

PUSCH增强方案的标准化工作 1.PUSCH重复传输类型A增强&#xff0c;包括两种增强机制&#xff1a;增加最大重复传输次数&#xff0c;以及基于可用上行时隙的重复传输次数技术方式。 2.基于频域的解决方案&#xff0c;包括时隙间/时隙内跳频的增强 3.支持跨多个时隙的传输块&…

苹果10月24日推送iOS 17.1:修复iPhone 12辐射超标问题 信号会更差

前段时间在iPhone 15系列发布的当天&#xff0c;法国突然宣布iPhone 12不能在该国销售&#xff0c;理由是iPhone 12超过了当地无线电频率暴露的法定范围。 根据法国监管机构ANFR(国家频率管理局)发布的最新消息&#xff0c;苹果将会在10月24日推送iOS 17.1正式版&#xff0c;届…

jmeter(三十三):阶梯线程组Stepping Thread Group,并发线程Concurrency Thread Group

Stepping Thread Group参数详解 this group will start:表示总共要启动的线程数;若设置为 100,表示总共会加载到 100 个线程first,wait for:从运行之后多长时间开始启动线程;若设置为 0 秒,表示运行之后立即启动线程then start:初次启动多少个线程;若设置为 0 个,表示…

移远通信携手MIKROE推出搭载LC29H系列模组的Click boards开发板,为物联网应用带来高精定位服务

近日&#xff0c;移远通信与MikroElektronika&#xff08;以下简称“MIKROE”&#xff09;展开合作&#xff0c;基于移远LC29H系列模组推出了多款支持实时动态载波相位差分技术&#xff08;RTK&#xff09;和惯性导航&#xff08;DR&#xff09;技术的Click Boards™ 开发板&am…

【计算机毕业设计】python在线课程培训学习考试系统637r7-PyCharm项目

使用说明 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0c;并导入项目的sql文件&#xff1b; 使用PyCharm 导入项目&#xff0c;修改配置&#xff0c;运行项目&#xff1b; 将项目中config.ini配置文件中的数据库配置改为自己的配置&#xff0c;…