在完成"来自tkinter import *"为什么没有定义ttk?

时间:2016-11-02 20:55:39

标签: python shell import tkinter ttk

执行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。那为什么会有错误?

2 个答案:

答案 0 :(得分:1)

下面的内容只是详细阐述jonrsharpe我认为可以回答这个问题的好评。

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

  

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

因此,如果包目录中有__init__.py文件(必须这样,否则它不会被导入),并且它包含一个名为__all__的列表而不是此列表&# 39; s内容被视为模块名称,以便导入调用模块的命名空间。

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

  

如果未定义__all__,则语句from package import *   不会将包中的所有子模块导入到   当前命名空间它只能确保包装   已导入(可能正在运行任何初始化代码)   __init__.py)然后导入包中定义的任何名称。这包括定义的任何名称(和子模块   由__init__.py加载)。它还包括包的任何子模块   由先前的import语句显式加载的。

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

答案 1 :(得分:0)

官方python documentation揭示答案

你可以做

from tkinter import *
from tkinter.ttk import *

或者

from tkinter import *

第二种方法用ttk版本覆盖'原始'tkinter小部件。因此,只需执行self.indicatorStyle即表示您要使用“原始”小部件。