tkinter messagebox的子导入问题

2024-04-27 00:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用tkinter编写一个GUI应用程序,现在我想使用tkinter内置的消息框,所以我想既然我已经导入了tkinter(作为tk),那么它应该是tk.messagebox.showerror(),但这或多或少起到了作用。。。在

当我通过IDLE运行它时,它没有问题,但是如果我在终端中使用python <module-name>.py,它会抛出一个AttributeError。在

下面是我能做的最简单的例子:

import tkinter as tk

root = tk.Tk()
tk.messagebox.showerror(title="Test Error", message="This is a test")
root.mainloop()

现在,如果我添加from tkinter import messagebox作为一个导入,那么这段代码在从终端运行时会工作得更奇怪(保持tk.messagebox.showerror)。显然,它仍然必须被视为tkinter的一个属性,那么为什么没有显式导入它就不能工作?在

我想我并不是真的在寻找这样的解决方案(因为我找到了一些方法让它起作用),而是更多地解释为什么会发生这种情况。在

一如既往,欢迎任何建议!在


Tags: namepyimport应用程序终端消息tkintergui
1条回答
网友
1楼 · 发布于 2024-04-27 00:18:27

这个问题以前曾以“为什么import tkinter; tkinter.font在IDLE中工作而在python中不工作?”解释是import是如何工作的,以及IDLE当前如何设置执行代码的子进程之间的交互作用。在

导入:系统模块是将模块名称映射到导入的模块对象的字典。在高层,import modname相当于以下内容。在

if modname not in sys.modules:
    sys.modules[modname] = module(modname)
modname = sys.modules[modname]

对于python编码的包,模块是从modname/__init__.py创建的。导入包不会导入其子模块。也就是说,它不运行modname/submodule.py。随后导入子模块会将子模块添加到系统模块并作为属性添加到包中。然后导入模块,将现有模块(以子模块作为属性)绑定到指定的名称。在

IDLE:当前,当IDLE为运行代码设置一个子进程时,它直接或间接地导入tkinter及其子模块。(代码在idlelib中/运行.py以及它导入的idlelib模块)

^{pr2}$

怠速启动时。因此,当您运行import tkinter时,它是进程中的第二个tkinter导入,并且名称'tkinter'被绑定到具有子模块作为属性的现有tkinter模块

python本身就是为了开发一个空闲的代码。对于IDLE来说,运行不能在python中运行的有缺陷的代码是一个缺陷。我正在处理refactoring idlelib以便上面的内容不会打印任何内容。唯一需要的tkinter模块是tkinter.messagebox只有在有问题阻止代码运行时才需要这样做。因此导入messagebox可以延迟到需要时,这是非常罕见的。在

相关问题 更多 >