如何避免 tkinter 在导入过程中弹出 window?

How to avoid tkinter from popping up a window during import?

有没有办法 运行 root = tk.Tk() 而不会弹出 window?

我正在使用 Python3.8.3 和 tkinter UI。我正在尝试从我的主脚本 运行 一个脚本(我将其称为副脚本,如果有更好的术语,我深表歉意)。这个想法是,用户将单击主脚本 window 上的按钮,然后将出现副脚本 window。如果我 运行 单独使用辅助脚本,它就可以正常工作。如果我从主脚本调用副脚本,则会出现错误,因为 root 是局部变量。我可以通过在辅助脚本中将 root 定义为全局变量来解决此错误。但是,当我这样做时,导入端会导致空的 tkinter window.

如果副脚本是:

def main():
    root = tk.Tk()
    app = MainApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()
else:
    pass

错误:未定义名称 'root',从主脚本调用时

如果副脚本是:

root = tk.Tk()

def main():
    app = MainApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()
else:
    pass

root 现在是一个全局变量,但是 blank tkinter window 在导入这一行 root = tk.Tk()

期间弹出

你能推荐我一个克服这个问题的好方法吗?

为了避免 window 弹出,让辅助脚本将 root 作为参数。

旁白:

def main(my_root):
    app = MainApp(my_root)
    my_root.mainloop()

甚至比这更好,把所有东西都放在一个 class 里。这样,所有的东西都一起订购了,你不需要导入任何东西。此外,如果您打开的 window 是主 window 的子项,则可以使用 Toplevel。 How do I create child windows with Python tkinter?

Is there a way to run root = tk.Tk() without popping out a window?

不,没有。您的代码设计有缺陷。您不应该在全局级别导入具有该行代码的脚本。

最简单的解决方案是将那行代码移到 if 语句中,就像您在第一个块中所做的那样:

def main():
    root = tk.Tk()
    app = MainApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

如果您从抱怨全局变量 root 的代码的其他部分得到一些错误,错误出在该代码中,而不是在您导入的代码中。正确的解决方案是删除对全局变量的依赖。那,或者在 main.

中声明 root 为全局