我正在编写一个简单的“Ping”应用程序,它将“颜色”标识添加到 ping 响应中。比如,如果响应失败 - 红屏,否则绿屏。
为了避免问题,我已经在 stackoverflow 上搜索了我的后续问题,但没有为我的案例找到任何可行的解决方案。一些链接,例如:
程序结构如下所示:
有两个文件。
main_window.py
与 main window
代码和 ping_window.py
与 ping window
代码。 main window
包含用于url的tk.Entry
s和一些“ping请求”修改(如-t
或-i
),以及开始ping的tk.Button
(我们称之为start button
)。
按下
start button
后,我调用一个函数,它创建并启动新的NewProcessPingWindow
类对象,继承自multiprocessing.process
(类位于ping_window.py
)。在它的run()
方法中,我创建了新的单独窗口(我们称之为ping window
)并启动ping()
函数,并从main window
的tk.Entry
s值传递。
在
ping window
我每秒显示ping结果(ping()
功能被移动到另一个线程,以避免ping window
ui冻结)。
在 PyCharm 中一切正常。但是当我用
pyinstaller --onefile main_window.py
构建一个可执行文件时,按下ping window
后就无法启动start button
了。而不是 .exe 创建 main window
的新副本,而不创建 ping window
。我可以无休止地继续这样做。创建新窗口后,每个旧窗口都会冻结。
当然我添加了
if __name__ == '__main__':
,但它没有帮助。所有在 IDE 中工作,但不适用于 .exe.
在问题的最后 我还添加了代码源,只要我的代码对于 stackoverflow 帖子来说有点长。为了避免误解,我没有从示例中删除任何内容。
附言我很确定我没有看到一个基本错误,但我正在搜索 2 天并且没有任何进展......
正如我所想,错误创建窗口的真正原因是我的过错和疏忽。我在
multiprocessing.freezing_support()
施工中不小心删除了if '__name__' == '__main__:
调用。所以,main_window
电话应该看起来像
if __name__ == '__main__':
multiprocessing.freeze_support()
main_window()
附言感谢 Alexander 帮我解决了这个问题