【问题标题】:after doing "from tkinter import *" why ttk is not defined?在执行“from tkinter import *”之后,为什么没有定义 ttk?
【发布时间】:2016-11-02 20:55:38
【问题描述】:

做了from tkinter import *之后为什么没有定义ttk* 是什么意思?

>>> from tkinter import *
>>> root = Tk()
>>> asd = ttk.Treeview(root)
Traceback (most recent call last):
  File <"pyshell#4">, line 1, in <module>
    asd = ttk.Treeview(root)
NameError: name 'ttk' is not defined

如果我做from tkinter import ttk,那么没有问题。在使用* 时,必须已获取ttk。那为什么会报错呢?

【问题讨论】:

标签: python shell import tkinter ttk


【解决方案1】:

以下内容只是详细说明jonrsharpe 的精彩评论,我认为它回答了这个问题。

Python 的from package import * 确实看起来像是从所述包中导入所有内容,但并非如此The docs说:

import 语句使用以下约定:如果包的 __init__.py 代码定义了一个名为__all__ 的列表,它被认为是从包导入时应该导入的模块名称列表 * 遇到了。

所以如果包目录中有一个__init__.py 文件(它必须有,否则无论如何它都不会被导入)并且它包含一个名为__all__ 的列表,那么这个列表的内容将被视为要导入的模块名称进入调用模块的命名空间。

如果__all__ 变量未在__init__.py 中定义会怎样?解释文档中的另一段:

如果__all__没有定义,语句from package import * 不会将包中的所有子模块导入到 当前命名空间;它只确保包有 已导入(可能在 __init__.py) 然后导入包中定义的任何名称。这包括定义的任何名称(以及明确的子模块 加载)由__init__.py。它还包括包的任何子模块 由先前的 import 语句显式加载。

如果您想要一个理解这一点至关重要的好例子,请前往video #20Derek Banas's excellent Python YT series. 中介绍使用 TkInter 进行 GUI 编程

【讨论】:

    【解决方案2】:

    官方python documentation揭晓答案

    你可以这样做

    from tkinter import ttk
    

    或者

    from tkinter import *
    from tkinter.ttk import *
    

    第二种方法使用 ttk 版本覆盖“原始”tkinter 小部件。所以只是做from tkinter import * 意味着你想使用“原始”小部件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2021-07-03
      • 2016-06-03
      • 2017-04-11
      • 2013-04-05
      相关资源
      最近更新 更多