做“从tkinter import *”后为什么没有定义ttk?

问题描述 投票:1回答:2

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
2个回答
1
投票

下面的内容正在详细阐述jonrsharpe的伟大评论,我认为这个评论可以回答这个问题。

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

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

因此,如果包目录中有一个__init__.py文件(它必须,否则它不会被导入)并且它包含一个名为__all__的列表,该列表的内容被视为要导入调用模块命名空间的模块名称。

如果在__all__中没有定义__init__.py变量,会发生什么?从文档中解释另一段:

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

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


0
投票

官方python documentation揭示了答案

你可以这样做

from tkinter import ttk

要么

from tkinter import *
from tkinter.ttk import *

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

© www.soinside.com 2019 - 2024. All rights reserved.