如果使用 Tkinter GUI 隐藏控制台,Python 可执行文件将无法工作

问题描述 投票:0回答:1

我有一个 Python 3.8.0 程序,可以从 YouTube 下载视频、提取音频并创建 mp3,所有这些都使用 Tkinter 界面。该程序在 VScode 中完美运行。我使用命令“pyinstaller --onefile code.py”将其制作为可执行文件; GUI 和控制台出现,并且可以正常工作。

现在,如果我添加“-w”来创建一个没有控制台、只有 GUI 的可执行文件,程序就会失败。 例外是:“NoneType”对象没有属性“write”并且发生在下一行中:

absolute_route = os.path.abspath(routemp4)
video = VideoFileClip(absolute_route)
routemp3 = absolute_route[:len(absolute_route)-4] + ".mp3"
video.audio.write_audiofile(routemp3)

' Routemp4 是使用“youtubeObject.default_filename”获取的 mp4 文件的路径,有效且具有音频(同样,在控制台打开的情况下,完全相同的代码也适用)。

我想可能是路径的问题,好像控制台关闭了GUI程序可能会遇到麻烦,但我添加了绝对路径,但没有任何改变。

如果控制台打开,代码可以正常工作,但如果只是 GUI,则代码会失败。 有一个类似的 stackoverflow 问题,但它已解决,因为该人的视频没有音频,这不是我的情况。我的问题出在 GUI 和控制台上。 预先感谢您。

python user-interface tkinter executable moviepy
1个回答
0
投票

当 Python 在没有控制台的情况下启动时,

sys.stdout
将设置为
None
。这在 sys 模块的文档中提到过。

大概有东西正在调用

sys.stdout.write

,这会导致您看到的错误。

相关问题的答案中所述,如果您可以将 sys.stdout.write

 替换为 
print
,那么将为您处理(即不会打印任何内容,也不会引发任何错误)。

如果您无法更改对

sys.stdout.write

 的调用,那么,按照 
an answer to a different related questions 中的建议,您可以将 sys.stdout
 (在程序开始时)设置为不执行任何操作的文件对象:

import sys, os sys.stdout = open(os.devnull, "w")
这应该消除错误。

© www.soinside.com 2019 - 2024. All rights reserved.