首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >tkinter messagebox的子导入问题

tkinter messagebox的子导入问题
EN

Stack Overflow用户
提问于 2016-02-25 05:22:56
回答 1查看 413关注 0票数 1

我正在用tkinter编写一个GUI应用程序,现在我想使用tkinter内置的消息盒,所以我想,既然我已经导入了tkinter (作为tk),它将只是tk.messagebox.showerror(),但这或多或少地是工作的.

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

以下是我能做的最简单的示例:

代码语言:javascript
代码运行次数:0
运行
复制
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的一个属性,那么为什么没有显式导入,它就不能工作呢?

我想我并不是真的在寻找这样的解决方案(因为我找到了某种方法让它工作),但更多的是对为什么会发生这种情况的解释。

任何建议都是欢迎的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 23:24:30

这个问题以前是以“为什么import tkinter; tkinter.font在空闲环境中工作而不是在python本身中工作”的形式出现的?解释是import工作方式与空闲当前如何设置执行代码的子进程之间的交互。

导入: sys.modules是将模块名映射到导入的模块对象的字典。在高级别上,import modname相当于以下内容.

代码语言:javascript
代码运行次数:0
运行
复制
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模块。)这可以通过运行

代码语言:javascript
代码运行次数:0
运行
复制
for name in sys.modules:
    if name.startswith('tkinter'):
        print(name)

当空闲开始的时候。因此,当您运行import tkinter时,它是进程中的第二个tkinter导入,名称'tkinter'绑定到现有的tkinter模块,该模块将子模块作为属性。

解决方案:空闲的目的是开发运行在python中的代码。在python中运行不运行的bug是空闲的错误。我正在重构idlelib上工作,这样上面的内容就不会打印任何内容了。唯一需要的tkinter模块是tkinter.messagebox,只有当出现问题时才需要这个模块来阻止代码的运行。因此,可以将messagebox的导入延迟到需要时,这是非常少见的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35619027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档