我用tkinter构建的GUI程序具有以下主要部分。
if __name__ == '__main__':
root = Tk()
my_gui = DataExtractorUI(root)
root.mainloop()
DataExtractor在单击按钮时调用另一个函数。所述功能内部具有多重处理任务。
从命令行运行时,GUI运行良好。
当使用pyinstaller或cx_Freeze编译为exe时,该程序将继续生成1 +数量的进程,并且无法正常工作。在我的pyinstaller规范文件中:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['MainGUI.py'],
pathex=['.'],
binaries=[],
datas=[('logo/m3_logo.png', 'logo')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='MainGUI',
debug=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='MainGUI')
一开始我在命令行版本上遇到了相同的问题,通过添加if __name__ == "__main__"
使用exe打包工具,我不清楚它为什么绕过__main__
入口点。
答案 0 :(得分:0)
由于python多重处理会为每个产生的进程启动一个新的解释器,因此每次新进程进入if __name__ == "__main__"
对于GUI程序,可以通过在程序顶部添加以下命令来解决:
multiprocessing.freeze_support()
@codewarrior在他的回答中描述了解决原因: Why python executable opens new window instance when function by multiprocessing module is called on windows