【问题标题】:How to avoid tkinter from popping up a window during import?如何避免 tkinter 在导入过程中弹出窗口?
【发布时间】:2020-11-19 03:23:49
【问题描述】:

有没有办法在不弹出窗口的情况下运行root = tk.Tk()

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

如果脚本是:

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 现在是一个全局变量,但是在导入此行root = tk.Tk()

的过程中会弹出 blank tkinter 窗口

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

【问题讨论】:

  • root.withdraw() 隐藏窗口并将其恢复,你可以使用root.iconify()
  • 您关于第一个区块的陈述不正确。如果我创建一个简单的脚本来导入第一个块,它不会给出你所说的错误。
  • 这真的取决于主脚本的设计,但你没有发布你的主脚本。
  • 我想我应该发布大部分代码。我害怕焦点会转移。学过的知识。无论如何,我学会了如何隐藏一个窗口以及修复它的好方法。谢谢大家的投入。

标签: python tkinter import popup


【解决方案1】:

有没有办法在不弹出窗口的情况下运行 root = tk.Tk()?

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

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

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

if __name__ == "__main__":
    main()

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

【讨论】:

  • 我的代码设计肯定很糟糕。我只是一个初学者。我将删除依赖项,感谢您的提示。
【解决方案2】:

为了避免弹出窗口,让侧脚本以 root 作为参数。

脚本:

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

比这更好,把所有东西都放在一个类中。这样,所有的东西都一起订购,您不必导入任何东西。此外,如果您打开的窗口是主窗口的子窗口,则可以使用 Toplevel。 How do I create child windows with Python tkinter?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2012-05-27
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多