我的理解是,tkinter程序的标准设置是这样开始的:

from tkinter import *
from tkinter import ttk

我知道tkinter是一个软件包,但是如果我已经使用*导入了所有内容,为什么还需要导入ttk呢?如果我取出第二行并尝试引用ttk,为什么会出现错误?

最佳答案

当您执行from some_package import *时,python将导入该包选择导出的任何内容。它选择导出的内容可能是实际存储在package文件夹中的子集。这是为什么?没有特别的原因,这只是程序包作者决定执行操作的方式。

有关导出内容的信息在包内的__init__.py文件(在本例中为tkinter/init.py)中定义。如果您查看该文件,您会注意到该文件本身不会导入ttk,因此不会导出ttk,因此无法通过通配符导入来导入。

同样,除了tkinter和ttk的作者选择做事的方式之外,没有其他特殊原因。

有关打包机制的更多信息,请参见python教程(https://docs.python.org/3/tutorial/modules.html#packages)的打包部分。

导入tkinter的更好方法

您可能会认为它是标准的,因为许多教程都是这样做的,但这通常是一种不好的做法。 IMO更好的方法是给tkinter库一个明确的名称:

# python 3.x
import tkinter as tk
from tkinter import ttk

# python 2.x
import Tkinter as tk
import ttk

这将使您的代码更容易阅读,因为您必须明确说明所使用的工具箱:
b1 = tk.Button(...) # uses a standard tk button
b2 = ttk.Button(...) # uses a ttk button

我认为没有其他任何理由可以这样做。每次调用tkinter函数时,进行全局导入都会为您节省几个字节,但这样做会降低清晰度。此外,它还强化了一种不好的做法,它可能会渗入您使用其他库的方式。

真正的权威IMO是PEP8,它在此问题上具有这样的说法:

10-05 20:24
查看更多