我正在用tkinter编写一个GUI应用程序,现在我想使用tkinter内置的消息盒,所以我想,既然我已经导入了tkinter (作为tk),它将只是tk.messagebox.showerror()
,但这或多或少地是工作的.
当我在空闲中运行它时,它没有问题,但是如果我在终端中使用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的一个属性,那么为什么没有显式导入,它就不能工作呢?
我想我并不是真的在寻找这样的解决方案(因为我找到了某种方法让它工作),但更多的是对为什么会发生这种情况的解释。
任何建议都是欢迎的!
发布于 2016-02-25 15:24:30
这个问题以前是以“为什么import tkinter; tkinter.font
在空闲环境中工作而不是在python本身中工作”的形式出现的?解释是import
工作方式与空闲当前如何设置执行代码的子进程之间的交互。
导入: sys.modules是将模块名映射到导入的模块对象的字典。在高级别上,import modname
相当于以下内容.
if modname not in sys.modules:
sys.modules[modname] = module(modname)
modname = sys.modules[modname]
对于python编码的包,模块是从modname/__init__.py
创建的。导入包并不导入其子模块。也就是说,它不运行modname/submodule.py
。随后,导入子模块将子模块添加到sys.modules,并将其作为属性添加到包中。导入模块之后,将现有模块绑定到指定的名称,该模块有一个子模块作为属性。
空闲:当前,当空闲设置运行代码的子进程时,它直接或间接地导入tkinter及其子模块。(代码位于idlelib/run.py中,它导入了idlelib模块。)这可以通过运行
for name in sys.modules:
if name.startswith('tkinter'):
print(name)
当空闲开始的时候。因此,当您运行import tkinter
时,它是进程中的第二个tkinter导入,名称'tkinter'
绑定到现有的tkinter模块,该模块将子模块作为属性。
解决方案:空闲的目的是开发运行在python中的代码。在python中运行不运行的bug是空闲的错误。我正在重构idlelib上工作,这样上面的内容就不会打印任何内容了。唯一需要的tkinter模块是tkinter.messagebox,只有当出现问题时才需要这个模块来阻止代码的运行。因此,可以将messagebox
的导入延迟到需要时,这是非常少见的。
https://stackoverflow.com/questions/35619027
复制