|
|
Python 解释器在执行代码时附带的控制台(Console)窗口。对于图形用户界面(GUI)程序来说,隐藏这个窗口是很常见的需求。
禁用控制台
在 PyInstaller 中使用 --noconsole 或 --windowed 参数非常简单。这两个参数作用完全相同,都是告诉 PyInstaller 在创建可执行文件(.exe)时,不要附带那个黑色的控制台窗口。
-w --noconsole, --windowed 创建无控制台窗口的程序。
pyinstaller --noconsole your_script.py
禁用了控制台后,你的程序如果发生崩溃或有 print 输出,你将看不到任何信息。
新进程的影响
控制台窗口依然会“一闪而过”。
这个现象的根本原因在于:在你的图形界面(GUI)完全加载并显示出来之前,PyInstaller 的引导程序(bootloader)或者你的 Python 脚本中的某些早期代码(比如某个 import 语句)执行了一些会触发控制台的操作。
这个过程非常快,但足以让一个黑框在屏幕上闪现一下
当你使用 subprocess.check_output (或 subprocess.run) 时,Windows 默认会为这个新进程创建一个控制台窗口。虽然 wmic 命令执行得非常快,但这个窗口创建和销毁的过程,就是你看到的那个“一闪而过”的黑框。
即使你使用了 --noconsole 参数打包,这个参数只作用于你的 Python 脚本主进程,它管不了你的脚本后来又创建的其他子进程。
CREATE_NO_WINDOW = 0x08000000
添加参数:creationflags=CREATE_NO_WINDOW
如下:
import subprocess
# Windows specific flag to prevent creating a new console window
# 为 subprocess.run 添加 creationflags 参数
CREATE_NO_WINDOW = 0x08000000
# 这样调用就不会闪现黑框了
subprocess.run(
["ping", "localhost"],
capture_output=True,
creationflags=CREATE_NO_WINDOW
)
启动画面
使用 PyInstaller 的启动画面(Splash Screen)功能。
这个方法并不能“消除”闪现,而是用一张漂亮的图片来“覆盖”它,极大地提升用户体验。当你的程序在后台解压和初始化时,用户看到的是一个加载图片,而不是一个黑框。
准备一张 .png 格式的图片,比如 splash.png。
在打包时添加 --splash 参数。
在你的代码中,当 GUI 准备好之后,调用特定代码来关闭这个启动画面
pyinstaller --noconsole --onefile --splash "splash.png" your_script.py
try:
import pyi_splash
pyi_splash.close()
except ImportError:
pass # 如果不是在 PyInstaller 环境中运行,则忽略
|
|