Tkinter 创建新的主窗口而不是在新进程中创建不同的窗口[重复]

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

我正在编写一个简单的“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 天并且没有任何进展......

python tkinter multiprocessing pyinstaller executable
1个回答
0
投票

正如我所想,错误创建窗口的真正原因是我的过错和疏忽。我在

multiprocessing.freezing_support()
施工中不小心删除了
if '__name__' == '__main__:
调用。所以,
main_window
电话应该看起来像

if __name__ == '__main__':
    multiprocessing.freeze_support()
    main_window()

附言感谢 Alexander 帮我解决了这个问题

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