在 Mac 上运行 Python tkinter 的图形界面时,有什么办法可以隐藏或最小化同步运行的 terminal 窗口?

2021-01-24 17:20:58 +08:00
 youthfire

只想通过 tkinter 上的按钮执行设计好的命令,不想出现黑色的终端窗口,求教

2457 次点击
所在节点    Python
23 条回复
LeeReamond
2021-01-24 17:40:12 +08:00
pyinstaller 打包,选择隐藏命令行模式
ClericPy
2021-01-24 17:50:30 +08:00
windows 上使用 pyw 扩展名或者说使用 pythonw 来执行脚本, 不知道 mac 上有没有
youthfire
2021-01-24 18:53:38 +08:00
@ClericPy #2 谢谢回复,特意去看了 mac 主程序目录里似乎没有 pythonw,目前我是直接改后缀为 command,支持双击运行但存在 terminal 同步运行
youthfire
2021-01-24 18:54:30 +08:00
@LeeReamond #1 感谢提供思路,回头我看看,但这样体积要剧增了吧
LeeReamond
2021-01-24 19:12:37 +08:00
@youthfire 不光体积剧增,还慢。但是总之我不知道除了打包以外还有隐藏 cli 的方法。可以尝试其他打包方式
youthfire
2021-01-24 19:21:55 +08:00
@LeeReamond 试过了,确实顺利完成了打包,且运行时没有终端窗口了.但 tkinter 的窗口是顺利加载了,但点击按钮后程序却没有正常运行.用的命令就是 pyinstaller --noconsole xxx.py,选用的是 dist 文件夹下的同名程序
BingoXuan
2021-01-24 19:30:24 +08:00
py2app 试一下?
yucongo
2021-01-24 22:58:30 +08:00
win.withdraw() 或许是你想要的
no1xsyzy
2021-01-24 23:10:44 +08:00
1. nohup
2. 不清楚 fork & exit 行不行。在 if __name__=='__main__': 的逻辑下面 if os.fork() != 0: sys.exit() 咯
ysc3839
2021-01-25 01:04:17 +08:00
@ClericPy @youthfire
macOS 自带的 Python2 是有 pythonw 的。
不过改文件名为 .pyw 并不能解决问题,因为这里的问题是 .pyw 没有关联任何打开方式,同时会出现终端窗口也是因为 .command 的打开方式是终端。

正确解决方法是让 Finder 直接把脚本作为可执行文件执行。但是即使把文件的扩展名去掉再加上执行权限,双击还是会打开终端。最终方案只有打包成 app 。

假设脚本文件名为 pygui.py ,在终端执行以下命令即可:
chmod +x ./pygui.py
mkdir -p pygui.app/Contents/MacOS
mv ./pygui.py pygui.app/Contents/MacOS/pygui

@no1xsyzy
fork 的方法不可行,macOS 下 fork 后不 exec 的话不能使用 CoreFoundation 。加了 fork 后会提示:
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.
youthfire
2021-01-25 01:51:09 +08:00
@ysc3839 感谢回复,试过了.打包完运行,显示“You can’t open the application “pygui” because this application is not supported on this Mac.” - 不清楚原因,目前用的是 Big Sur 11.1
youthfire
2021-01-25 01:52:08 +08:00
@yucongo 这个不是,这个隐藏了 tkinter 的 root(window),我是需要隐藏 terminal
ysc3839
2021-01-25 01:58:18 +08:00
@youthfire 确定脚本开头加了 #!/usr/bin/env python3 吗?
youthfire
2021-01-25 02:10:00 +08:00
@ysc3839 原来确实没加.现在加上不报这个错误了,直接双击运行,app 毫无反应
youthfire
2021-01-25 02:17:06 +08:00
@BingoXuan 谢谢推荐,也试过了.pyinstaller 的能加载出 gui,但不能执行命令.这个打包后 gui 都加载不出
ysc3839
2021-01-25 02:23:05 +08:00
@youthfire 那用终端 cd 进去然后执行 ./pygui 呢?
youthfire
2021-01-25 02:52:10 +08:00
@ysc3839 zsh: no such file or directory: ./pygui
ysc3839
2021-01-25 04:58:05 +08:00
@youthfire 是 cd 到 pygui.app /Contents/MacOS 下面。
no1xsyzy
2021-01-25 11:01:28 +08:00
那 exec 一下?
os.execvp("python3", sys.argv)
(不对,那样就死循环了)

不是很依赖封包的话可以用 nohup 启动的。
no1xsyzy
2021-01-25 11:13:43 +08:00
1.
#!/usr/bin/nohup python3
(用 nohup 替换 env )
(估计是会闪烁一下黑窗口)
不过不能给 python3 添加更多参数了

2.
还有就是 https://stackoverflow.com/a/1810580/6202760
实质 fork && exit || exec

3.
看到说 macos 上需要用 spawn
那就用 magic number (通过 argv 或者 环境变量传递)如果没有 magic number 就添加 magic number 并 spawn & exit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX