【问题标题】:Python tkinter 8.5 import messageboxPython tkinter 8.5 导入消息框
【发布时间】:2021-08-04 22:43:56
【问题描述】:

以下代码在 IDLE 中运行良好,但否则我得到“NameError:未定义全局名称'messagebox'”。但是,如果我明确声明from tkinter import messagebox,它从任何地方都可以正常运行。

from tkinter import *
from tkinter import ttk 

root = Tk()
mainFrame = ttk.Frame(root)
messagebox.showinfo("My title", "My message", icon="warning", parent=mainFrame)

为什么 IDLE 不需要显式的 import 语句,而在其他地方却需要?

【问题讨论】:

  • IDLE 是一个 tkinter 程序,所以它有自己的导入和根。在 IDLE 中使用 tkinter 编程是个坏主意。最好在控制台中避免异常行为。

标签: python tkinter messagebox nameerror


【解决方案1】:

messagebox.showinfo 在tkinter/showinfo.py 中定义,但是当您使用from tkinter import * 时,您只需导入tkinter/__init__.py,其中包含Label、Entry、Button、...的定义...这就是python 导入的方式工作。

当您使用from tkinter import messagebox 时,它会在tkinter/__init__.py 中查找messagebox,但找不到它,因此它会尝试导入tkinter/messagebox.py

关于IDLE异常,是IDLE中的一个bug,我相信已经修复了。

【讨论】:

    【解决方案2】:

    消息框是 tkinter 的一个单独子模块,因此只需从 tkinter 进行完整导入:

    from tkinter import *
    

    不导入消息框

    它必须像这样显式导入:

    from tkinter import messagebox
    

    与必须显式导入 ttk 的方式相同

    它在空闲时工作的原因是因为空闲导入消息框是为了自己的目的,并且由于空闲的工作方式,它的导入在空闲时可以访问

    【讨论】:

    • 有道理。很好的答案。
    【解决方案3】:

    IDLE 是用 Python 编写的,并使用 Tkinter 作为 GUI,因此看起来您的程序正在使用 IDLE 本身正在使用的 import 语句。但是,如果你想在 IDLE 进程之外执行你的程序,你应该明确地包含 messagebox 的 import 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 2020-10-07
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多